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_codeAddOrUpdate()方法将添加一条新记录。 如果boat_code是'HelloWorld`,它将更新现有记录。 我相信这就是你要找的......

希望这可以帮助!