76 votes

Entity Framework 5 copie en profondeur / clone d'une entité

J'utilise Entity Framework 5 ( DBContext ) et j'essaie de trouver le meilleur moyen de copier en profondeur une entité (c'est-à-dire de copier l'entité et tous les objets associés), puis d'enregistrer les nouvelles entités dans la base de données. Comment puis-je faire ceci? J'ai envisagé d'utiliser des méthodes d'extension telles que CloneHelper mais je ne sais pas si cela s'applique à DBContext .

131voto

Leo Points 2637

Un moyen simple et peu coûteux de cloner une entité est de procéder de la manière suivante:

 var originalEntity = Context.MySet.AsNoTracking()
                             .FirstOrDefault(e => e.Id == 1);
Context.MySet.Add(originalEntity);
Context.SaveChanges();
 

L'astuce ici est AsNoTracking () - lorsque vous chargez une entité comme celle-ci, votre contexte ne le sait pas et lorsque vous appelez SaveChanges, il la traite comme une nouvelle entité.

Si MySet a une référence à MyProperty et que vous souhaitez en obtenir une copie également, utilisez simplement un Include :

 var originalEntity = Context.MySet.Include("MyProperty")
                            .AsNoTracking()
                            .FirstOrDefault(e => e.Id == 1);
 

23voto

Jas Laferriere Points 103

Voici une autre option.

 var source = Context.ExampleRows.FirstOrDefault();
var clone = new ExampleRow();

Context.ExampleRows.Add(clone);

var sourceValues = Context.Entry(source).CurrentValues;
Context.Entry(clone).CurrentValues.SetValues(sourceValues);

clone.ExampleProperty = "New Value";

container.SaveChanges();
 

Cette méthode copie les valeurs actuelles de la source dans une nouvelle ligne ajoutée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X