在NHibernate中克隆一个实体?

时间:2012-06-13 10:32:09

标签: c# nhibernate

我想将一个对象保存到数据库两次。我有这段代码:

using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{
    var entity = new Entity();

    ss.Save(entity);
    ss.Save(entity);

    tt.Commit();
}

但是这导致只有一行被添加到数据库中。如何将单个对象插入数据库两次(使用两个不同的ID)?

2 个答案:

答案 0 :(得分:7)

你不应该这样做 - NHibernate在它的会话中保持“对象身份”,所以它不会区分..well ..同一个对象。我真的建议不要这样做,更好的解决方案是查看克隆对象的方法(通过反射或克隆方法),然后保存克隆对象。

如果您想忽略我上面的建议,您可以通过从会话中逐出实体来将其设置为工作,将其ID设置回未保存的值(取决于您的映射,但可能为0),然后再次保存它。

如果您刚刚调用了session.Merge(实体)两次(在第一次调用后可能必须将id重置为未保存的值),它也可能有效。

或者你可以使用session.Merge()的无状态会话,然后你不必在Save之间驱逐实体。

答案 1 :(得分:3)

您可以通过两种方式实现:

  1. 克隆实体,应该是深层复制。

    using (var ss = NHibHelp.OpenSession())
    using (var tt = ss.BeginTransaction())
    {
      var entity = new Entity();
      var clonedEntity = entity.Clone();
      ss.Save(entity);
      ss.Save(clonedEntity);
    
      tt.Commit();
    }
    
  2. 如果您的ID已分配,请记住创建新ID。深层复制存在复杂实体的一些问题,如果您有反向收集,则需要重新引用它们。

    2.在新会话中打开第二个事务并提交它。

    var entity = new Entity();
    using (var ss = NHibHelp.OpenSession())
    using (var tt = ss.BeginTransaction())
    {      
         ss.Save(entity);
    
         tt.Commit();
    }
    
    using (var ss = NHibHelp.OpenSession())
    using (var tt = ss.BeginTransaction())
    {      
         ss.Save(entity);
    
         tt.Commit();
    }
    
相关问题