14

以前に Entity Framework やジェネリックを使用したことがなく、コードを削減するのに苦労しています。

テキスト ファイルを解析して、夜間に変更される可能性のあるデータを含む 10 個のルックアップ テーブルをロードしています。テキスト ファイルには、「タイプ」の見出しとそれに続くキー/値セットのリストがあります。これは完全に機能していますが、コードをリファクタリングしてクリーンアップし、ジェネリックメソッドを使用してこれを達成したいので、重複したコードを減らすことができます.

解析をジェネリック メソッドに落とし込みましたが、ジェネリックな方法でエンティティをコンテキストに追加する方法を理解できませんでした。各タイプのエンティティのリストをループして、コンテキストに追加する必要があります。

void Main()
{
    switch (line.ToUpper())
    {
        case "AREA":
        {
            List<Area> areaList = this.GetItems<Area>(file);

            foreach (var element in areaList)
            {
                if (context.Area.Find(element.Id) == null)
                {
                    context.Area.Add(element);
                }
            }

            break;
        }
        case "CATEGORY":
        {
            List<Category> categoryList = this.GetItems<Category>(file);

            foreach (var element in categoryList)
            {
                if (context.Category.Find(element.Id) == null)
                {
                    context.Category.Add(element);
                }
            }

            break;
        }
    }
}

private List<T> GetItems<T>(StreamReader reader) where T : ILookupData, new()
{
    string line;
    List<T> list = new List<T>();            

    while (reader.Peek() == ' ')
    {
        line = reader.ReadLine().TrimStart();
        string[] tokens = line.Split(new string[] { " - " }, 2, StringSplitOptions.None);

        T item = new T();
        item.Id = Convert.ToInt32(tokens[0]);
        item.Description = (string)tokens[1];

        list.Add(item);
    }

    return list;
}

更新:上記は正常に機能しますが、コンテキストを追加できないようです。

いくつかの異なることを試しましたが、コンテキストを一般化しようとすると、このエラーが発生し続けるようです:

型 'T' は、メソッドのジェネリック型でパラメーター 'T' として使用するには、参照型である必要があります。

私が最後に試みたのは、ジェネリック GetDbSet をコンテキストに追加することでした。

public DbSet<T> GetDbSet<T>() where T : class
{
    return this.Set<T>();
}

しかし、このコードを GetItems メソッドに追加すると、コントローラーで同じエラーが発生します。

using (MyContext context = new MyContext())
{
    var dbSet = context.GetDbSet<T>();
}
4

1 に答える 1

34

現在のプロジェクトに汎用リポジトリがあります。これはその add メソッドです:

public void Add<T>(T newItem) where T : class
{
    db.Set<T>().Add(newItem);
}

オブジェクト自体dbはどこにありますか。DbContext参照型に関するwhere T : classエラーを修正。それがなければ、 orを含む任意の型、または処理できない任意の値型を T として渡すことができます。は、T が参照型であるクラスでなければならないため、許可されることを指定します。boolstructDbSet.Add()where

于 2013-06-05T16:02:32.997 に答える