web-dev-qa-db-fra.com

Entity Framework - UPSERT sur des index uniques

J'ai cherché un peu concernant mon problème mais je ne trouve rien qui puisse vraiment aider.

Donc mon problème/dilema reste comme ceci: je sais que la base de données mysql a un système d'index unique qui peut être utilisé pour insérer/mettre à jour dans la même requête en utilisant ce format: insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c); et un format de remplacement utilisé pour remplacer un existant enregistrement par cet index.

pour être honnête, le seul truc similaire que j'ai vu dans MSSQL est le merge mais je ne l'aime vraiment pas du tout et vérifier une requête à insérer ou à mettre à jour n'est pas un index unique basé après tout ...

Alors, comment puis-je émuler l'UPSERT unique mysql dans Entity Framework? c'est mon principal problème ...

Je veux dire sans obtenir l'enregistrement de l'ensemble d'entités et le vérifier s'il est nul ou non pour une insertion ou une mise à jour possible;

Puis-je l'avoir? Ou pas? Tout indice peut être utile

J'ai vu this mais n'apparaît pas dans la version 6 ...

exemple d'entité:

    [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; }            
    }

Je veux donc mettre à jour/insérer en fonction de l'index unique de mon IX_ProviderBoat en utilisant EF

enter image description here

21
HellBaby

La méthode AddOrUpdate est membre de IDBSet et est disponible dans EF6.

La méthode AddOrUpdate n'est pas une opération atomique, les appels provenant de plusieurs threads ne garantissent pas le deuxième thread Update au lieu de Adding à nouveau - afin que vous puissiez obtenir des enregistrements en double stocké.

Cet exemple a été testé et a fonctionné selon vos attentes:

        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();
        }

Si nous changeons boat_code, La méthode AddOrUpdate() ajoutera un nouvel enregistrement. Si boat_code Est "HelloWorld", il mettra à jour l'enregistrement existant. Je crois que c'est ce que vous cherchez ...

J'espère que cela t'aides!

20
wahwahwah