簡體   English   中英

是否可以創建一個將項添加到實體框架dbset的通用方法?

[英]Is it possible to create a generic method for adding items to a entity framework dbset?

我之前沒有使用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>();
}

我當前項目中有一個通用存儲庫。 這是它的添加方法:

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

其中dbDbContext對象本身。 where T : class修復了有關引用類型的錯誤。 沒有它,你可以傳遞任何類型為T,包括boolstruct ,或任何值類型, DbSet.Add()無法處理。 where指定T必須是一個類,它是一個引用類型,因此允許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM