Meilleur auteur de réponses
Dupliquer une entité et conserver les liens de navigation originels

Question
-
Bonjour à tous,
Depuis ce matin je me casse la tete pour trouver un moyen de dupliquer une entité tout en conservant ses propriétés de navigation.
En gros, si j'ai une entity person qui possède une propriété de navigation vers une entity Sexe (relation 0-1) et une autre propriété de navigation de type entitycollection nommée adresses, j'aimerai pouvoir prendre une entité personne nommée Homer Simpson, Sexe Masculin, avec une adresse à springfield et une autre au japon, la dupliquer pour changer le prénom pour Bart, enregistrer et constater en base que Bart Simpson est bien relié au sexe masculin ainsi qu'aux deux adresses qui sont associées à Homer. Bien entendu, Homer est toujours en base, on parle bien d'une duplication simple.
Je ne trouve pas de moyen de réaliser cette manoeuvre.
Connaissez vous un mécanisme EF qui permettrai de le réaliser ?
Merci d'avance
Réponses
-
Bonjour
Vous devez cloner un objet.
N'est pas très simple, mais la solution c'est ici:
http://www.codeproject.com/Articles/137853/Cloning-the-Entity-object-and-all-related-children
Cordialement,
- Marqué comme réponse Aurel Bera jeudi 8 août 2013 07:09
-
Bonjour,
J'ai fait bien plus simple car dans mon cas j'avais besoin de cloner une entité, conserver les mêmes propriétés de navigation que l'originale et gérer un cas.
Voici la méthode (qui s'inspire du tuto de codeproject) :
For Each pi As PropertyInfo In obj.GetType.GetProperties.Where(Function(a) a.PropertyType.Name.ToUpper() = "ENTITYCOLLECTION`1").ToList Dim coll As Object = pi.GetValue(obj) coll.Load() Next Dim persState As ObjectStateEntry = context.ObjectStateManager.GetObjectStateEntry(obj) persState.ChangeState(EntityState.Added)
En gros, je prend l'entity (obj), je fais un load des EntityCollections pour qu'elles soient chargées au moment du clonage, puis je change son état à Added.
Seule contrainte (plutot métier que technique) : si j'ai une relation 0n-01 (donc que la propriété de navigation ne peut avoir qu'une seule instance de l'entity clonée en retour - exemple : PERSON peut avoir N ADRESSE mais une ADRESSE ne peut etre liée qu'à une PERSON) il faut gérer manuellement le clonage de l'entity enfant (je pourrais l'automatiser mais cela force les développeurs à reflechir à ce qu'ils font vraiment en clonant cette entity).
Merci quand même pour le lien, j'étais tombé dessus avant d'avoir posé la question ici, je pensais qu'il y avait un moyen plus simple et déjà géré dans le framework de faire ce genre d'opération.
- Modifié insomniak49 jeudi 8 août 2013 07:51 ajout d'une précision
- Marqué comme réponse Aurel Bera jeudi 8 août 2013 07:52
Toutes les réponses
-
Bonjour
Vous devez cloner un objet.
N'est pas très simple, mais la solution c'est ici:
http://www.codeproject.com/Articles/137853/Cloning-the-Entity-object-and-all-related-children
Cordialement,
- Marqué comme réponse Aurel Bera jeudi 8 août 2013 07:09
-
Bonjour
Avez-vous des nouvelles pour nous?
Merci
Cordialement,
-
Bonjour,
J'ai fait bien plus simple car dans mon cas j'avais besoin de cloner une entité, conserver les mêmes propriétés de navigation que l'originale et gérer un cas.
Voici la méthode (qui s'inspire du tuto de codeproject) :
For Each pi As PropertyInfo In obj.GetType.GetProperties.Where(Function(a) a.PropertyType.Name.ToUpper() = "ENTITYCOLLECTION`1").ToList Dim coll As Object = pi.GetValue(obj) coll.Load() Next Dim persState As ObjectStateEntry = context.ObjectStateManager.GetObjectStateEntry(obj) persState.ChangeState(EntityState.Added)
En gros, je prend l'entity (obj), je fais un load des EntityCollections pour qu'elles soient chargées au moment du clonage, puis je change son état à Added.
Seule contrainte (plutot métier que technique) : si j'ai une relation 0n-01 (donc que la propriété de navigation ne peut avoir qu'une seule instance de l'entity clonée en retour - exemple : PERSON peut avoir N ADRESSE mais une ADRESSE ne peut etre liée qu'à une PERSON) il faut gérer manuellement le clonage de l'entity enfant (je pourrais l'automatiser mais cela force les développeurs à reflechir à ce qu'ils font vraiment en clonant cette entity).
Merci quand même pour le lien, j'étais tombé dessus avant d'avoir posé la question ici, je pensais qu'il y avait un moyen plus simple et déjà géré dans le framework de faire ce genre d'opération.
- Modifié insomniak49 jeudi 8 août 2013 07:51 ajout d'une précision
- Marqué comme réponse Aurel Bera jeudi 8 août 2013 07:52
-
Merci de votre retour.
Cordialement,