Comment copie en profondeur une entité
J'ai trouvé cet extrait ici:
public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream()) {
var bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
return (T)bf.Deserialize(ms);
}
}
Qui dit que nous pouvons faire de copie en profondeur de tous les objets par le biais de cette chose.
Je suis en train de faire une copie comme ceci:
db.Detach(myEntity);
myEntity.EntityKEy = null;
Entity newEntity = new Entity();
newEntity = DeepClone<Entity>(Entity);
db.Entities.AddObject(newEntity);
db.SaveChanges();
IL fonctionne, mais n'a toujours pas la copie de imbriquée\documents connexes. que dois-je faire de mal ici?
J'ai cette structure Entity->ChildEntity ->ChildChildEntity
-> - d'un-à-plusieurs
donc je suppose que quand je copie entité il permettra également de copier tous les enregistrements enfants.
Mise à JOUR:
Après des suggestions, je l'ai fait:
Entity newEntity = new Entity();
Eneity Entity = db.Include("ChildEntity").Where(p=>p.Id==Id).Single();
newEntity = DeepClone<Entity>(Entity);
db.Detach(myEntity);
myEntity.EntityKEy = null;
db.Entities.AddObject(newEntity);
db.SaveChanges();
Obtention d'exception sur AddObject ligne:
Un objet avec la même clé existe déjà dans le Vousmanager.
Le Vousmanager ne peut suivre plusieurs objets avec le même
clé.
oui, vous avez raison, des tables de référence sont vides si vous cherchez à le débogage :(. Pourquoi cela pourrait-il arriver? c'est de cette façon-je Récupérer mon objet d'origine: Entité d'origine = db.Les entités.Où(l=>l'.ID == myId).Unique();
Pouvez-vous poster le code de votre entité?
C'est un méchant profonde-la copie de la sorte...pas très performant...
quelle est la bonne façon?
OriginalL'auteur user194076 | 2012-01-26
Vous devez vous connecter pour publier un commentaire.
Le point important est que vous devez charger des entités associées et de créer de profondes clone avant de détacher. Si vous détacher de l'entité toutes les relations sont supprimés silencieusement parce que
Detach
méthode ne fonctionne que pour une seule entité et l'entité graphique ne peut pas se compose à la fois attaché et détaché des entités. C'est une raison pour laquelle vous avez besoin de sérialisation au lieu de simplement appelerDetach
.Ne pas oublier de désactiver le chargement paresseux, sinon votre sérialisation d'extraire des données pour d'autres propriétés de navigation à partir de la base de données. Rappelez-vous aussi que cette copie en profondeur permettra de créer de nouvelles version de toutes les entités dans le graphe ainsi, l'ajout de l'entité de la racine va ajouter toutes les entités liées.
OriginalL'auteur Ladislav Mrnka
La EntityKeys pour tous les enfants des objets clonés trop, de sorte que vous devez régler chaque enfant EntityKey à null avant d'essayer de les ajouter avec AddObject.
OriginalL'auteur Roy Goode
Si vous n'avez pas chargé l'enfant entités avant de détacher l'entité, ils ne vont pas être sérialisé. Assurez-vous que tous ceux de la navigation propriétés que vous voulez à une profonde clone sont chargés avant de vous détacher de l'entité.
Modifier
Désireux de charge de la navigation propriétés qui doivent être sérialisés
Mise à jour de ma réponse
Regarde mieux, prendre un coup d'oeil à ma mise à jour s'il vous plaît si vous pouvez.
OriginalL'auteur Eranga
Vous peut-être devrait enregistrer avant d'essayer de brancher l'entité, une fois de plus
Cochez cette question. Vous devez vous détacher de tous les objets que vous obtenez pour copie en profondeur référencé dans votre objet : stackoverflow.com/questions/1131779/...
Poster ici si cela a fonctionné, s'il vous plaît.
OriginalL'auteur radu florescu