簡體   English   中英

實體框架 - 獨特索引上的UPSERT

[英]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_codeAddOrUpdate()方法將添加一條新記錄。 如果boat_code是'HelloWorld`,它將更新現有記錄。 我相信這就是你要找的......

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM