0

我阅读了这个关于我的问题的帖子,但仍有疑问。

我有两个实体——一个订单和一个任务。订单与其子任务之间存在一对多的关系。

//Order.hbm.xml
<bag name="Tasks" table="Task" inverse="true" cascade="all-delete-orphan">
  <key column="OrderID" />
  <one-to-many class="Task, Orders" />
</bag>

//Task.hbm.xml
<many-to-one name="Order" column="OrderID" />

我想删除一个任务并让 NHibernate 保持我的订单同步。

我的第一次尝试产生了这个问题:

删除的对象将被级联重新保存

我通过在提交交易之前手动清理 Order 对 Task 的引用来解决这个问题:

public void DeleteTask()
{
    NHibernateSessionManager.Instance.BeginTransaction();
    //Need to remove Order's reference to Task before deleting so that Task is not resaved.
    Task.Order.Tasks.Remove(Task);
    TaskDao.Delete(Task);
    NHibernateSessionManager.Instance.CommitTransaction();
}

不过,似乎这段代码应该能够由 NHibernate 的 XML 文件处理。这是一个正确的假设吗?我需要如何更改我的 NHibernate 配置,以便在删除任务时自动清理其父订单的引用?

4

1 回答 1

3

实际上,既然你有cascade="all-delete-orphan",你可以不用显式Delete()

public void DeleteTask()
{
    NHibernateSessionManager.Instance.BeginTransaction();
    Task.Order.Tasks.Remove(Task);
    NHibernateSessionManager.Instance.CommitTransaction();
}

这更像是 DDD-ish,因为您可以在不引用 NH 的情况下从模型 itelf 进行更改,然后让 NH 的更改跟踪来处理删除。

于 2012-09-12T12:45:41.830 回答