c# - 实现 Entity Framework 6 添加或更新方法的最简单方法是什么

标签 c# database entity-framework linq entity-framework-6

我有一个使用 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/

相关文章:

mysql - 该数据库是否标准化

c# - EF5 代码优先 - 具有额外字段的多对多

C# Entity Framework 自定义约束

c# - 在具有服务层的多层架构中,一个服务调用另一个服务是否可以接受?

c# - 是否可以检测导航事件中是否加载了 IFRAME?

时间:2019-05-17 标签:c#genericclass: how can I restrict a member function to be used with specific types?

c# - .NET Web 应用程序中的 native 依赖项未加载

c# - Visual Studio Code - C# 控制台应用程序

database - 需要用整型主键加入 double 外键

php - 在哪里保存信用卡详细信息?存入数据库好不好