web-dev-qa-db-ja.com

エンティティフレームワーク-一意のインデックスに対するUPSERT

私は自分の問題について少し検索しましたが、本当に役立つものは何も見つかりません。

だから私の問題/ジレマは次のように留まります: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かどうかを確認することなく、

私はそれを手に入れることができますか?か否か?任意のヒントが役立ちます

私は this を見ましたが、バージョン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一意のインデックスに基づいて更新/挿入したいので

enter image description here

21
HellBaby

AddOrUpdateメソッドはIDBSetのメンバーであり、EF6で使用できます。

AddOrUpdateメソッドはアトミック操作ではありません。複数のスレッドからの呼び出しは、Updateingの代わりに2番目のスレッド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`の場合、既存のレコードを更新します。これがあなたが探しているものだと思います...

お役に立てれば!

20
wahwahwah