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, но мне это совсем не нравится, и проверка запроса на вставку или обновление не является уникальным индексом, основанным на всех...

Итак, как я могу эмулировать mysql уникальный UPSERT в Entity Framework? это моя главная проблема...

Я имею в виду, не получая запись из набора объектов и проверяя ее, если она является нулевой или нет для возможной вставки или обновления;

Могу ли я получить его? Или нет? Любой намек может быть полезным

Я видел этот, но не появляется в версии 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; }            
    }

Итак, я хочу обновить/вставить на основе моего уникального индекса IX_ProviderBoat, используя EF

enter image description here

Ответ 1

Метод AddOrUpdate является членом IDBSet и доступен в EF6.

Метод AddOrUpdate не является атомарной операцией, вызовы из нескольких потоков не гарантируют второй поток Update вместо Add ing снова - чтобы вы могли сохранить повторяющиеся записи.

Этот пример был протестирован и работал с вашими ожиданиями:

        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", он обновит существующую запись. Я считаю, что это то, что вы ищете...

Надеюсь, это поможет!