我想将一个对象保存到数据库中两次。我有这个代码:
using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{
var entity = new Entity();
ss.Save(entity);
ss.Save(entity);
tt.Commit();
}
但这导致只有一行被添加到数据库中。如何将单个对象插入数据库两次(具有两个不同的 ID)?
我想将一个对象保存到数据库中两次。我有这个代码:
using (var ss = NHibHelp.OpenSession())
using (var tt = ss.BeginTransaction())
{
var entity = new Entity();
ss.Save(entity);
ss.Save(entity);
tt.Commit();
}
但这导致只有一行被添加到数据库中。如何将单个对象插入数据库两次(具有两个不同的 ID)?
你不应该这样做 - NHibernate 在它的会话中维护“对象身份”,所以它不会区分......好吧......同一个对象。我真的建议不要这样做,更好的解决方案是查看一种克隆对象的方法(通过反射或克隆方法),然后保存克隆的对象。
如果您想忽略我上面的建议,您可以通过从会话中驱逐实体,将其 id 设置回未保存的值(取决于您的映射,但可能为 0),然后再次保存它来使其工作。
如果您只是调用 session.Merge(entity) 两次,它也可能有效(您可能必须在第一次调用后将 id 重置为未保存的值)。
或者,您可以使用带有 session.Merge() 的无状态会话,然后您不必在 Save 之间驱逐实体。
你可以通过两种方式做到这一点:
克隆实体,应该是深拷贝。
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();
}
如果您的 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();
}