流利的NHibernate级联删除问题
问题描述:
我遇到了流利的nhibernate级联删除问题。我确定我做错了什么,因为它不起作用。流利的NHibernate级联删除问题
这里是我的对象:
public class Parent
{
public int Id { get; set; }
public IList<SequencedChild> SequencedChildren { get; set; }
}
public class SequencedChild
{
public int Id { get; set; }
public int ParentId { get; set; }
public int ChildId { get; set; }
public int Sequence { get; set; }
}
public class Child
{
public int Id { get; set; }
}
这里是我的映射:
HasMany(m => m.SequencedChildren).Inverse().Cascade.Delete();
所以我有一些测序孩子家长,我想更新父有没有孩子。当我在那个父母上没有排序的孩子进行更新时,我期望在我的SequencedChild
表中具有父母的ID的记录将被删除。但由于某种原因NHibernate试图更新ParentId
这些记录为空 - 失败,因为ParentId
不为空。 编辑:我也期待子对象不受影响(这是行为正确)。
我看了几个问题,他们都建议使用逆,但我已经这样做了。我究竟做错了什么?
答
所以我设法找到这竟然有多个步骤的解决方案:
- 正如詹姆斯在评论的ParentId指出/ childID的应该是父/子引用不仅仅是IDS(+1为)
-
SequencedChild
需要有一个显式映射将级联设置为无 - 进行更新时,不要覆盖SequencedChild列表。首先清除它然后添加新的项目。 (或者只是清楚,如果你的arent更换项目)
- 的
Inverse()
通话是没有必要的 - 在db表中的
ParentId
字段应该是空,因为NHibernate的上更新它来将其删除之前坚持。 (如果有人知道解决这个问题留下评论)
答
尝试将级联更改为Cascade.AllDeleteOrphan()以删除SequencedChild表上的孤儿子记录。
问题是孤儿不能被创建,因为ParentId是NotNull和NHibernate试图将它们设置为null。 – 2010-12-03 01:14:15
您的SequencedChild类是否真的具有ParentId/ChildId而不是对父/子的引用?如果是这样,Inverse()不会正常工作,因为您告诉NHibernate Child正在管理一对多关系,但是该子对象没有对其父对象的返回引用。 NHibernate没有办法告诉ParentId(一个int)是反向引用。 – 2010-12-03 01:39:49