父节点在NHibernate中仍然有引用时删除子对象

时间:2012-09-11 21:50:41

标签: c# nhibernate

我看了this thread regarding my issue,但仍有疑问。

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

//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配置,以便在删除任务时自动清除其父命令的引用?

1 个答案:

答案 0 :(得分:3)

实际上,由于您有cascade="all-delete-orphan",因此您可以不使用明确的Delete()

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

这是更多的DDD-ish,因为你可以从模型中进行更改而不引用NH,然后让NH的更改跟踪处理删除。