重复的对象图并在nhibernate中保持为新的

时间:2009-03-19 17:47:05

标签: nhibernate

我想创建“以前的版本”,以便用户可以撤消所做的更改并回滚到以前的版本。

我有一个具有各种属性的管理器对象和一组管理员工。这涉及数据库中的两个表,其中工作人员通过外键链接到管理器。

我想要做的是复制经理及其所有员工,并将其作为经理表中的新条目以及员工表中与新经理相关的一系列新条目保存回数据库。 。

我正在使用nhibernate,并想知道是否有一种聪明的方法来做到这一点。

我能想到的唯一方法是手动:

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); 
}

上面的例子并不完全是我怎么做的,但你得到了我希望的想法。

我已经考虑过使用反射来获取道具而不是手动设置它们,但这就像我一样聪明。

是否有一种方法可以在nhibernate中复制对象图并将其作为新条目保留回来?

还是有人有任何好主意?

1 个答案:

答案 0 :(得分:0)

如果您将实体标记为可序列化,则可以执行二进制序列化。

   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);

    }

基本上你会调用Serialize然后调用DeSerialize方法,这会给你一个图表的深层副本,然后你必须更新你可能拥有的任何ID。

谨慎之处,我不确定这将如何与nHibernates延迟加载功能一起使用。我已经做了很多,但没有从nHibernate中提取的对象。另外,不要忘记将Serializable放在对象上。