这是经典的" 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();
}
任何聪明的想法?
谢谢!
答案 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