gpt4 book ai didi

c# - 是否可以创建用于将项目添加到 Entity Framework dbset 的通用方法?

转载 作者:可可西里 更新时间:2023-11-01 08:55:13 24 4
gpt4 key购买 nike

我之前没有使用过 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;
}

更新:上面的工作正常,但似乎无法添加上下文。

我已经尝试了一些不同的东西,但是当我尝试概括上下文时似乎一直出现这个错误:

The type 'T' must be a reference type in order to use it as parameter 'T' in the generic type of method.

我尝试的最后一件事是将通用的 GetDbSet 添加到上下文中:

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

但是我在将此代码添加到 GetItems 方法的 Controller 中遇到了同样的错误:

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 必须是一个类,它是一个引用类型,因此是允许的。

关于c# - 是否可以创建用于将项目添加到 Entity Framework dbset 的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com