/ / entités de clonage profondes utilisant EF6 - .net, entity-framework, entity-framework-6

entités de clonage profond utilisant EF6 - .net, entity-framework, entity-framework-6

J’ai fait beaucoup de recherches à ce sujet et je n’ai toujours pas trouvé de solution pour cloner une entité et pouvoir la sauvegarder, y compris à tous les niveaux de relations enfants.

Est-ce que quelqu'un sait comment s'y prendre?

BTW j'ai obtenu ce travail en utilisant AsNoTracking () etpuis en utilisant Include ("Child ...") mais il y a 5 niveaux de relations dans ma base de données et environ 100 tables à inclure donc je "m après un moyen automatique de le faire

Réponses:

0 pour la réponse № 1

J'ai essayé 3 manières différentes, avec la sérialisation (nonutilisable dans la plupart des cas à cause de la charge Lazy), implémentant ICloneable sur une entité de base avec réflexion et utilisant des attributs personnalisés pour contrôler le comportement du clonage (je pense que vous recherchez ceci) et implémentant ICloneable sur chaque entité.

En fait, je mets en œuvre ICloneable sur chaque entité. D'habitude je fais ça:
1. MemberwiseClone ()
2. Appelez ICloneable.Clone d'entités associées pour renseigner les propriétés (uniquement sur certaines propriétés).
3. sur d'autres entités liées, je fais une copie superficielle (dépend des besoins)

Je sais que c'est mauvais, mais d'après mon expérience, si j'utilise d'autres méthodes au démarrage du projet, Clone fonctionne bien, mais après 6 mois, Clone sur certaines entités clone la moitié de la base de données.

Dans votre cas, avec la charge différée activée, vous pouvez utiliser la réflexion.
1. Ignorer la propriété simple
2. Appelez Cloner pour chaque propriété complexe
3. faire une foreach sur chaque propriété ICollection appelant Clone et en ajoutant le résultat à une liste correspondante

Le problème dans cette approche est que vous allezcloner la base de données entière à chaque fois. Vous pouvez décider d'arrêter certaines entités en remplaçant Clone ou en utilisant des attributs personnalisés pour les propriétés, mais vous avez besoin de quelque chose pour éviter de cloner l'intégralité de la base de données.

Si vous n’activez pas la charge différée, vous pouvez appeler avant le clonage.

context.Entry(myEntry).Reference("myRefProp").Load();
context.Entry(myEntry).Collection("myColl").Load();

mais ils ne résolvent pas votre problème.

MODIFIER
J'ai toujours le code pour appliquer cette méthode (avecattributs), je ne l’utilise pas depuis des siècles, mais si vous en avez besoin, je peux le poster quelque part. En fait, j'implémente toujours l'ICloneable sur chaque entité car utiliser des attributs pour arrêter la sérialisation ou l'arrêter dans l'implémentation Clone est préférable de l'arrêter dans l'implémentation Clone.