[英]Entity Framework - UPSERT on unique indexes
我搜索了一下我的問題,但找不到任何真正有用的東西。
所以我的問題/困境保持這樣:我知道mysql數據庫有一個唯一的索引系統,可以使用這種格式在同一查詢中插入/更新: insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c);
以及用於替換該索引的現有記錄的替換格式。
說實話,我在MSSQL中看到的唯一類似的東西是merge
但我真的不喜歡它,並且驗證插入或更新的查詢根本不是唯一的索引...
那么如何將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
方法不是原子操作,來自多個線程的調用不保證第二個線程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<Boat>().AddOrUpdate(boat); // <-- IDBSet!!!
context.SaveChanges();
}
如果我們更改boat_code
, AddOrUpdate()
方法將添加一條新記錄。 如果boat_code
是'HelloWorld`,它將更新現有記錄。 我相信這就是你要找的......
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.