0

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

我有需要重新保留已删除对象的情况。

删除父对象很好。父对象和子对象都从数据库中删除。

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

当然,我可以在删除时将父级的 ID 强制为零,但随后将子级的 ID 强制为零似乎很麻烦。

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

非常感谢

4

1 回答 1

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.

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

于 2012-06-13T10:02:29.637 回答