我有一个NHibernate对象,其子集合映射为AsBag,Inverse,Cascade.AllDeleteOrphan。
我有需要重新保留已删除对象的场景。
删除父对象很好......父项和子项将从数据库中删除。
问题是,我需要重新保存/保存已删除的对象。如果我尝试调用SaveUpdate,我会得到一个StaleObjectStateException,因为Id字段仍然设置为父和子对象的非零值。
当然,我可以强制删除父级的Id为零,但是然后强制孩子的ID变为零似乎很麻烦。
有没有更好的策略来处理这个?
非常感谢
答案 0 :(得分:0)
如果你Evict
之后Delete
,Flush
之前,你就会好起来;它会滚动你的挂起删除。
// Act
using (ISession session = _factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
session.Save(expected);
session.Flush();
session.Delete(expected);
session.Evict(expected);
tx.Commit();
}
using (ISession session = _factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
actual = session.Get<Person>(expected.Id);
var count = actual.Roles.Count;
}
// Assert
expected.ShouldHave().AllProperties().EqualTo(actual); // succeeds; record is not deleted or otherwise molested.
然而,一旦你冲洗,没有一个好方法撤消/重新保存。弄清楚如何避免首先删除对象,避免在删除和恢复之间刷新,或者回滚事务以撤消删除。另一种选择,如果可以将数据重新保存为新记录(只要保留值),则只需克隆已删除的记录并保存。