使用Entity Framework防止重复插入而没有唯一约束

时间:2018-04-11 16:32:22

标签: c# .net entity-framework ef-code-first

这是经典的" upsert"问题。我知道如何使用纯SQL来实现这一点,但是无法使用Entity Framework(v6,代码优先)找到等价物。

鉴于以下实体:

public class Product
{
    [Key]
    public int Id { get; set; }

    public string Sku { get; set; } // Should be unique

    // Other properties
}

我想创建Save(Product p)方法,如果给定的Sku不存在,则创建新记录,或者如果数据库中已存在Sku,则更新现有记录。 Save方法不能创建具有重复Skus的记录。此外,DB中的Sku列没有定义唯一约束。

在插入记录之前检查重复项显然不会在多进程环境中工作。我尝试将支票包裹在一笔交易中,但这不起作用:

using (var db = new MyDbContext())
using (var transaction = db.Database.BeginTransaction())
{
    // if exists, retrieve and update
    // otherwise insert

    db.SaveChanges();
    transaction.Commit();
}

任何聪明的想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您使用Entity Framework 6.1+,则可以使用Index注释的IsUnique属性。

有问题,您提到了insert without unique constraint,但是,uniqueness中的public class Product { [Key] public int Id { get; set; } [StringLength(450)] [Index(IsUnique = true)] public string Sku { get; set; } // Other properties } 首先是通过代码实现的。我希望这是你想要的。

SaveChanges

当我运行此代码时,DbUpdateExceptions会按预期抛出using (DataContext dataContext = new DataContext()) { MyClass myClass1 = new MyClass() {Sku = "test1"}; MyClass myClass2 = new MyClass() {Sku = "test2"}; MyClass myClass3 = new MyClass() {Sku = "test2"}; MyClass myClass4 = new MyClass() {Sku = "test3"}; dataContext.TestTable.Add(myClass1); dataContext.TestTable.Add(myClass2); dataContext.TestTable.Add(myClass3); dataContext.TestTable.Add(myClass4); dataContext.SaveChanges(); }

database.mdf