我有一个使用 Entity Framework 6 的项目,它为一堆不同的实体类型执行添加或更新(即 Upsert)。对于这些实体中的每一个,都有一个代理整数 ID(即主键)、一个用于外部查找的自然键(例如客户 ID)和一组描述性字段(例如名称、描述等)
我有一个 AddOrUpdate 方法,它查找自然键,在数据库中找到一个现有实体,并用新值更新该实体(如果它存在)或创建一个新实体并将其添加到数据库中(如果它尚不存在)。
这是我想出的方法的一个示例(请注意,“key”是自然键,而不是代理 ID):
public void AddOrUpdate(int key, string name)
{
var customer = _database.Customers
.FirstOrDefault(p => p.Key == key);
var exists = customer != null;
if (!exists)
customer = new Customer();
customer.Name = name;
// Update other descriptive fields here
if (!exists)
_database.Customers.Add(customer);
_database.Save();
}
代码运行正常,但总感觉有点乱。我很想知道是否有人有更好的方法来使用 Entity Framework 解决这个问题,该方法在结构上更简单,可读性更好,或者可以用更少的代码行(不牺牲可读性)完成,并且仍然易于单元测试。
如果是这样,请发布您对上述代码的重构,以便我可以从您的示例中学习。
最佳答案
EntityFramework 已经为您实现了这一点,you can learn more about it here
void Main()
{
using (AppContext context = new AppContext())
{
context.Users.AddOrUpdate(...);
}
}
public class AppContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class User
{
public string UserId { get; set; }
public string Name { get; set; }
}
编辑
这个答案已经被否决了两次,因为它显然不是线程安全的。这可能会让一些人感到惊讶,但 Entity Framework 作为一个框架并不是线程安全的。
MSDN DbContext - Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
基本上,我的解决方案的线程安全性是无关紧要的,因为跨并行线程使用 Entity Frameworks DbContext(特别是 SaveChanges/SaveChangesAsync 方法)会给您带来开箱即用的问题。
关于c# - 实现 Entity Framework 6 添加或更新方法的最简单方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196170/