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
.
Réponses
Trop de publicités?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);
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.