entity framework – 对唯一索引的UPSERT
我搜索了一下我的问题,但找不到任何真正有用的东西。
所以我的问题/困境保持这样:我知道mysql数据库有一个唯一的索引系统,可以使用这种格式在同一查询中插入/更新: insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c);
以及用于替换该索引的现有记录的替换格式。
说实话,我在MSSQL中看到的唯一类似的东西是merge
但我真的不喜欢它,并且validation插入或更新的查询根本不是唯一的索引…
那么如何将mysql独特的UPSERT模拟到Entity Framework中呢? 这是我的主要问题……
我的意思是没有从实体集中获取记录并检查它是否为null或者是否为可能的插入或更新;
我能得到它吗? 或不? 任何提示都很有用
我看到了这个,但没有出现在版本6中……
实体的例子:
[Table("boats")] public class Boat { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int id { get; set; } [MaxLength(15)] [Index("IX_ProviderBoat",1,IsUnique=true)] public string provider_code { get; set; } public string name { get; set; } [Index("IX_ProviderBoat", 3, IsUnique = true)] [MaxLength(50)] public string model { get; set; } [Index("IX_ProviderBoat", 2, IsUnique = true)] [MaxLength(15)] [Key] public string boat_code { get; set; } public string type { get; set; } public int built { get; set; } public int length { get; set; } }
所以我想使用EF基于我的IX_ProviderBoat唯一索引更新/插入
AddOrUpdate
方法是AddOrUpdate
的成员,可在IDBSet
中使用。
AddOrUpdate
方法不是primefaces操作,来自多个线程的调用不保证第二个线程Update
而不是再次Add
– 因此您可以获取存储的重复记录。
这个例子经过测试并符合您的期望:
Boat boat = new Boat // nullable fields omitted for brevity { boat_code = "HelloWorld", id = 1, name = "Fast Boat", built = 1, length = 100 }; using (BoatContext context = new BoatContext()) // or whatever your context is { context.Set().AddOrUpdate(boat); // <-- IDBSet!!! context.SaveChanges(); }
如果我们更改boat_code
, AddOrUpdate()
方法将添加一条新记录。 如果boat_code
是'HelloWorld`,它将更新现有记录。 我相信这就是你要找的......
希望这可以帮助!