NHibernate坚持以前'已删除'对象

时间:2012-06-13 09:30:21

标签: nhibernate

我有一个NHibernate对象,其子集合映射为AsBag,Inverse,Cascade.AllDeleteOrphan。

我有需要重新保留已删除对象的场景。

删除父对象很好......父项和子项将从数据库中删除。

问题是,我需要重新保存/保存已删除的对象。如果我尝试调用SaveUpdate,我会得到一个StaleObjectStateException,因为Id字段仍然设置为父和子对象的非零值。

当然,我可以强制删除父级的Id为零,但是然后强制孩子的ID变为零似乎很麻烦。

有没有更好的策略来处理这个?

非常感谢

1 个答案:

答案 0 :(得分:0)

如果你Evict之后DeleteFlush之前,你就会好起来;它会滚动你的挂起删除。

        // 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.

然而,一旦你冲洗,没有一个好方法撤消/重新保存。弄清楚如何避免首先删除对象,避免在删除和恢复之间刷新,或者回滚事务以撤消删除。另一种选择,如果可以将数据重新保存为新记录(只要保留值),则只需克隆已删除的记录并保存。