J'essaye de faire un clone profond de certaines entités. L'approche mentionnée dans this article a l'air bien mais je rencontre des erreurs. Il suggère d'utiliser AsNoTracking() pour récupérer l'entité, puis de la réinsérer dans le contexte où elle entraînera une insertion car elle ressemble à un nouvel objet.Problème d'utilisation d'AsNoTracking avec EntityFramework
Voici mon code:
Using ctxt As New ProductionDataEntities
Dim grade = ctxt.Grades.Include(Function(g) g.GradeWidths).AsNoTracking.First
ctxt.Grades.AddObject(grade)
ctxt.SaveChanges()
End Using
Mais quand je le lance je reçois:
Un objet avec la même clé existe déjà dans le ObjectStateManager. L'objet existant est dans l'état Modifié. Un objet ne peut être ajouté à ObjectStateManager à nouveau que s'il est dans l'état ajouté.
Et lorsque je modifie grade.Name, EntityState est modifié pour indiquer qu'il fait l'objet d'un suivi. J'utilise EF5 Db-First.
J'ai également essayé de cloner en détachant le grade et en le réinsérant, cela fonctionne mais les Largeurs de Grade ne sont pas copiées. Dès que je l'appelle détachez le nombre gradewidth va de 2 à 0.
Questions:
- Toute idée pourquoi AsNoTracking ne fonctionne pas et ce que je peux faire pour résoudre ce problème?
- Une autre approche peut-elle être recommandée pour un clonage simple en profondeur?
Merci.
---- Informations complémentaires ----
J'ai 5 1-à-plusieurs et, finalement, je vais à cloner à partir du haut niveau tout en bas. Mais je simplifie pour regarder le niveau le plus bas.
- 1 e année à de nombreux GradeWidths
Vous vouloir attacher l'entité au contexte, ne pas l'ajouter. L'ajout créerait seulement une nouvelle ligne dans la table quand même. – DavidG
@DavidG - J'essaie de créer une nouvelle ligne (c'est-à-dire Dupliquer). En outre, je ne peux pas appeler joindre car l'entité est déjà attachée malgré que j'appelle AsNoTracking – FloatingKiwi
Ah je devrais l'avoir lu! Ensuite, vous avez probablement juste besoin de blitz la valeur de la clé primaire. – DavidG