2009-03-19 6 views
2

Je veux créer des "versions précédentes" afin qu'un utilisateur puisse annuler les modifications apportées et revenir à une version précédente.Reproduire un graphique d'objet et le conserver comme nouveau dans nhibernate

J'ai un objet manager avec diverses propriétés et une collection de personnel géré. ceci concerne deux tables dans la base de données avec du personnel lié au gestionnaire par une clé étrangère. Ce que je voudrais faire est de dupliquer le gestionnaire et tout son personnel et de le sauvegarder dans la base de données en tant que nouvelle entrée dans la table du gestionnaire et une série de nouvelles entrées dans la table de personnel que nous avons liée au nouveau directeur. J'utilise nhibernate et je me demandais s'il y avait une façon intelligente de le faire avec ça.

La seule façon que je peux penser à le faire manuellement:

manager old = getManager(); // get the original for copying 

manager newManager = new manager(); // create a blank object 
newManager .name = old.name //give the new manager the old one's props; 

//cycle through the staff duplicate and add to new managers staff collection 
foreach(staff s in old.staffCollection) 
{ 
    staff newStaff = new staff(); 
    newstaff.name = s.name; 
    newManager.staffCollection.Add(newstaff); 
} 

l'exemple ci-dessus est pas exactement comment je le ferais, mais vous obtenez l'idée que je l'espère.

J'ai pensé à utiliser la réflexion pour obtenir les accessoires au lieu de les régler manuellement, mais c'est à peu près aussi intelligent que j'ai.

Y a-t-il un moyen dans nhibernate de copier le graphe d'objet et de le conserver comme de nouvelles entrées?

ou est-ce que quelqu'un a des idées brillantes?

+0

Je sais que c'est juste un exemple de code, mais j'espère vraiment que vos noms de classe 'manager' et' staff' ne sont pas vraiment minuscules! – kroimon

Répondre

0

Si vous marquez vos entités comme sérialisables, vous pouvez effectuer la sérialisation binaire.

public static MemoryStream Serialize(object data) 
    { 

     MemoryStream streamMemory = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.AssemblyFormat = FormatterAssemblyStyle.Simple; 

     formatter.Serialize(streamMemory, data); 

     return streamMemory; 
    } 
    public static Object Deserialize(MemoryStream stream) 
    { 

     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.AssemblyFormat = FormatterAssemblyStyle.Simple; 
     return formatter.Deserialize(stream); 

    } 

Essentiellement, vous appelez la sérialisation alors la méthode Désérialiser cela vous donnera une copie en profondeur de votre graphique, alors vous devez mettre à jour les ID de vous pourriez avoir. Par prudence, je ne sais pas comment cela fonctionnera avec la fonctionnalité de chargement paresseux de nHibernates. Je l'ai fait beaucoup mais pas avec des objets que je tire de nHibernate. N'oubliez pas de mettre Serializable sur vos objets.

+0

Je reçois une erreur System.Runtime.Serialization.SerializationException: Tapez 'NHibernate.Cfg.Configuration' dans Assembly 'NHibernate, Version = 1.2.1.4000, Culture = Neutre, PublicKeyToken = aa95f207798dfdb4' n'est pas marqué comme sérialisable. Je ne peux pas marquer cela comme sérialisable aussi? –

+0

Non vous ne devriez pas, vos objets n'ont aucune référence à cela ou la Session ou SessionFactory font-ils? – JoshBerke

+0

certaines méthodes statiques font. J'ai manager.create (newManager) par exemple. Je suppose que tu vas me dire que je devrais utiliser un modèle de repo et arrêter de nhibernate sur mes entités? –

Questions connexes