gpt4 book ai didi

c# - Entity Framework 核心 : What is the fastest way to check if a generic entity is already in the dbset and then add or update it?

转载 作者:行者123 更新时间:2023-11-30 20:18:04 33 4
gpt4 key购买 nike

我从 CSV 文件加载数据,动态创建实体,然后将它们添加到 List<T> .

以下代码采用 List<T>并将实体添加到右侧 DbSet .

public static void AddEntities<T>(List<T> entities, DbContext db) where T :class
{
using (db)
{
var set = db.Set<T>();

foreach(T e in entities)
{
set.Add(e);
}
db.SaveChanges();
}
}

我想将其更改为仅在实体不存在时才添加该实体,否则必须更新它。

使用 Entity Framework Core 实现这一目标的最佳方法是什么?我相信我应该使用 System.Reflection到:

  • 至少获得 ID,但最好获得 dbset 的所有键
  • 遍历键以查找实体是否已在 DbSet 中
  • 如果找到则使用新实体的值更新它,否则将其添加到集合中

像这样:

public static void AddEntities<T>(List<T> entities, DbContext db) where T :class
{
using (db)
{
var set = db.Set<T>();

foreach(T e in entities)
{
var idProperty = e.GetType().GetProperty("ID").GetValue(e,null);
var obj = set.Find(idProperty);

if (obj==null)
{
set.Add(e);
}
else
{
var properties = (typeof(T)).GetProperties();

foreach (var p in properties)
{
var value = e.GetType().GetProperty(p.Name).GetValue(e,null);
obj.GetType().GetProperty(p.Name).SetValue(obj,value);
}
}

}
db.SaveChanges();
}
}

代码的运行速度比简单的加法慢 3 到 4 倍。

有没有更快的方法?我找到的所有代码示例都是针对 EF6 的, 基于 ObjectContextIObjectContextAdapter而且这种代码似乎不再适用于 EF Core .

最佳答案

您可以使用 EF Core 公共(public)(和一些内部)元数据服务来获取 Find 方法所需的键值,而不是反射。要设置修改后的值,您可以使用 EntityEntry.CurrentValues.SetValues方法。

像这样:

using Microsoft.EntityFrameworkCore.Metadata.Internal;

public static void AddEntities<T>(List<T> entities, DbContext db) where T : class
{
using (db)
{
var set = db.Set<T>();

var entityType = db.Model.FindEntityType(typeof(T));
var primaryKey = entityType.FindPrimaryKey();
var keyValues = new object[primaryKey.Properties.Count];

foreach (T e in entities)
{
for (int i = 0; i < keyValues.Length; i++)
keyValues[i] = primaryKey.Properties[i].GetGetter().GetClrValue(e);

var obj = set.Find(keyValues);

if (obj == null)
{
set.Add(e);
}
else
{
db.Entry(obj).CurrentValues.SetValues(e);
}
}
db.SaveChanges();
}
}

关于c# - Entity Framework 核心 : What is the fastest way to check if a generic entity is already in the dbset and then add or update it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485128/

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