NHibernate以前一直存在';删除';对象

NHibernate以前一直存在';删除';对象,nhibernate,Nhibernate,我有一个NHibernate对象,它的子集合映射为AsBag、Inverse、Cascade.AllDeleteOrphan 我有一个场景,需要重新持久化已删除的对象 删除父对象没有问题。父对象和子对象将从数据库中删除 问题是,我需要重新保存/保留已删除的对象。如果尝试调用SaveUpdate,则会得到一个StaleObjectStateException,因为父对象和子对象的Id字段仍然设置为非零值 当然,我可以在删除时强制父Id为零,但是强制子Id为零似乎很麻烦 有没有更好的策略来处理这个问

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

我有一个场景,需要重新持久化已删除的对象

删除父对象没有问题。父对象和子对象将从数据库中删除

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

当然,我可以在删除时强制父Id为零,但是强制子Id为零似乎很麻烦

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


非常感谢如果在
删除之后
退出
,但在
刷新之前,你会没事的;它将回滚您的挂起删除

        // 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.
//Act
使用(ISession session=\u factory.OpenSession())
使用(ITransaction tx=session.BeginTransaction())
{
会话。保存(预期);
session.Flush();
删除(预期);
会议.驱逐(预期);
tx.Commit();
}
使用(ISession session=\u factory.OpenSession())
使用(ITransaction tx=session.BeginTransaction())
{
实际=session.Get(预期的.Id);
var count=实际的.Roles.count;
}
//断言
应为.ShouldHave().AllProperties().EqualTo(实际);//成功;记录未被删除或以其他方式受到骚扰。

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

感谢快速响应,但在这种情况下,它将不起作用……我确实需要一种机制,可以删除并重新保存对象图。我们所做的是:a。创建了一个带有单个方法ResetId的接口,该方法添加到每个行为类似的对象中。B如果对象实现了我们称之为ResetId的接口,则钩住PostCommitDeleteEventListeners事件。您是否预见到这种方法存在任何问题?多谢你想要的最终结果是什么?是否将删除的图形保存为全新图形?在这种情况下,是的,删除后可能需要重新保存;这种类型的“事务”也会跨越多个会话(在web应用程序中)。顺便说一句,这不是一个“长时间运行”的事务。我只想像我提到的那样克隆它(只需添加一个
clone
方法,复制并返回所有相关的值,对图中每个深度的类型也这样做)。我不推荐您的
ResetId
方法的原因是因为
GetHashCode
。如果您正确地实现了实体,您将覆盖
Equals
GetHashCode
,其中您将基于ID进行比较。因此,要重置对象,您必须重置ID和hashcode,并且实例返回的hashcode不应更改。然而,尽管存在技术细节,你的建议和我的类似:重新保存的实例需要重新设置/取消设置ID。