Entity Framework 6: Cloner un objet à l'exception de l'ID
Dans mon MVVM programme, j'ai une classe de Modèle (dire MyModel
) à partir de laquelle j'ai une instance de lecture à partir de la base de données (à l'aide de Entity Framework). Lors de la récupération de l'objet que je vais présenter toutes les données à l'utilisateur. Plus tard, l'utilisateur sera la modification de certains champs.
Ce que je veux, c'est créer le même objet, sauf pour c'est ID
(depuis que ID
est le clé primaire et auto incrémenté).
Alors comment pouvais-je m'approche de cela? Je ne veux pas copier tous les champs un par un, ce n'est pas une approche robuste. Peut-être parce que, dans l'avenir, le modèle peut être modifié, de sorte que de cette façon je vais devoir le prendre en compte dans la méthode de clonage.
Si il ya une manière élégante de copier l'objet, et lors de l'enregistrement dans la base de données, il est ID obtient auto incrémenté de nouveau? (Réglage de l'ID de null
me donne une erreur de compilation, car il est de type int
).
- Qu'en est ValueInjecter? Unfortunetaly, il rend la copie superficielle, elle n'est pas profonde. valueinjecter.codeplex.com
- Pouvez-vous nous montrer votre modèle de classe?Si non,est-ce un POCO?A-t-elle des propriétés complexes?
- tout juste de terminer la lecture, avant de penser à, je dirais, à charge ensuite détacher et vous serez d'avoir votre copie prête pour l'insertion. Maintenant nous devons parler de type complexe comme suggéré par @GeorgeVovos
Vous devez vous connecter pour publier un commentaire.
J'ai remarqué qu'il n'est pas nécessaire pour la copie. Apparemment, lors de l'ajout d'une instance d'un modèle de la base de données (même si le code est défini à celui qui existe déjà dans la base de données), Entity Framework insère une nouvelle ligne dans la base de données et de l'auto-incrémente de la clé primaire. Afin que cette fonctionnalité est déjà intégrée dans les EF. Je ne savais pas cela, désolé.
Juste pour plus de clarté voici un exemple:
.Where()
extension linq méthode est juste un exemple. Vous pouvez également utiliser la.Find()
méthode sur une Entité CadreDbSet<T>
pour que le saké. Mais ce n'est pas le point, le point est que EF auto-incrémente l'ID lorsque vous ajoutez un sale modèle de votre DbContext.Lori Peterson a suggéré d'utiliser .AsNoTracking() pour effectuer le clonage dans EF6. Je suis en utilisant cette méthode et je peux confirmer que cela fonctionne. Vous pouvez même inclure des objets enfants.
.Include("ChildEntities")
- à partir de msdn: Dot-liste séparée par des objets liés à retourner dans les résultats de la requête.Lors de l'utilisation de ObjectContext la réponse fournie par QuantumHive ne fonctionne pas.
L'erreur retournée dans cette situation :
Correctement cloner un objet entity framework (au moins dans EF6.0) est:
context.SaveChanges()
avant d'insérer une clé en double, puis le sous-jacent attaché entités pourraient avoir des doubles de clés, et c'est ce que le message d'exception est à juste titre se plaindre. Donc, cela dépend totalement de votre cas d'utilisation et de mise en œuvre. Vous devez vous pas ont les entités en double avec la même clé attaché à le même contexte. Dans mon exemple, je suis évidemment l'interrogation d'une entité à partir d'une nouvelle base de données de contexte, donc, dans ce cas, il t fonctionne.J'ai trouvé cette recherche pour voir si il y a une meilleure façon de cloner un objet que j'étais en train de l'aide et a remarqué qu'il y est un problème potentiel avec la accepté de répondre si vous essayez de faire de multiples clones...au moins si vous voulez éviter de créer votre contexte, à de nombreuses reprises...
Je ne sais pas si c'est la meilleure approche pour le clonage, c'est pourquoi je cherchais une autre façon. Mais, il fonctionne. Si vous avez besoin de cloner une entité à plusieurs reprises, vous pouvez utiliser la sérialisation JSON pour cloner...quelque chose comme ceci (à l'aide Newtonsoft JSON).
Je utiliser la base de données postgres:
Aucune des méthodes ne fonctionnent pas dans mon cas. J'utilise deuxièmement: