Copier EntityCollection vers EntityCollection impossible?

Comment feriez-vous cela (pseudo-code): product1.Orders.AddRange (product2.Orders);

Toutefois, la fonction “AddRange” n’existe pas. Comment pouvez-vous copier tous les éléments de EntityCollection “Orders” de product2 vers product1?

Devrait être simple, mais ce n’est pas …

Le problème est plus profond que vous ne le pensez.

Votre tentative foreach échoue, car lorsque vous appelez product1.Orders.Add , l’entité est supprimée de product2.Orders , ce qui rend l’énumérateur existant non valide, ce qui provoque l’exception que vous voyez.

Alors, pourquoi l’entité est-elle retirée de Prod2? Cela semble bien simple: parce que la commande ne peut appartenir qu’à un seul produit à la fois . Entity Framework s’occupe de l’intégrité des données en appliquant de telles règles.

Si je comprends bien, votre objective est de copier les commandes d’un produit à un autre, est-ce exact?

Si tel est le cas, vous devez créer explicitement une copie de chaque commande à l’intérieur de votre boucle foreach , puis l’append à product1 .

Pour une raison qui m’est relativement obscure, il n’existe aucun moyen automatisé de créer une copie d’une entité. Par conséquent, vous devez quasiment copier manuellement toutes les propriétés de Order, une par une. Vous pouvez rendre le code plus net en incorporant cette logique à la classe Order. Créez une méthode nommée Clone () qui copiera toutes les propriétés. Veillez toutefois à ne pas copier la propriété “owner product reference” (référence du produit propriétaire), car votre objective est de lui donner un autre produit propriétaire, n’est-ce pas?

Quoi qu’il en soit, n’hésitez pas à poser plus de questions si quelque chose n’est pas clair. Et bonne chance.

  • Fyodor

Sur la base des deux réponses précédentes, j’ai proposé la solution de travail suivante:

 public static void AddRange(this EntityCollection destinationEntityCollection, EntityCollection sourceEntityCollection) where T : class { var array = new T[sourceEntityCollection.Count()]; sourceEntityCollection.CopyTo(array,0); foreach (var entity in array) { destinationEntityCollection.Add(entity); } } 

Oui, les fonctions habituelles liées à la collection ne sont pas là.

Mais,
1. Avez-vous vérifié la méthode CopyTo ?
2. Trouvez-vous un problème avec l’iterator? Vous savez, GetEnumerator, parcourir la collection et copier les entités?

Les deux ci-dessus peuvent résoudre vos problèmes. Mais, je suis sûr que dans .NET 3.0+, il y aurait des solutions compactes.

Mes réponses sont liées à .NET 2.0