2010-12-03 96 views
1

我遇到了流利的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不为空。 编辑:我也期待子对象不受影响(这是行为正确)。

我看了几个问题,他们都建议使用逆,但我已经这样做了。我究竟做错了什么?

回答

3

所以我设法找到这竟然有多个步骤的解决方案:

  1. 正如詹姆斯在评论的ParentId指出/ childID的应该是父/子引用不仅仅是IDS(+1为)
  2. SequencedChild需要有一个显式映射将级联设置为无
  3. 进行更新时,不要覆盖SequencedChild列表。首先清除它然后添加新的项目。 (或者只是清楚,如果你的arent更换项目)
  4. Inverse()通话是没有必要的
  5. 在db表中的ParentId字段应该是空,因为NHibernate的上更新它来将其删除之前坚持。 (如果有人知道解决这个问题留下评论)
1

尝试将级联更改为Cascade.AllDeleteOrphan()以删除SequencedChild表上的孤儿子记录。

+0

问题是孤儿不能被创建,因为ParentId是NotNull和NHibernate试图将它们设置为null。 – 2010-12-03 01:14:15

+0

您的SequencedChild类是否真的具有ParentId/ChildId而不是对父/子的引用?如果是这样,Inverse()不会正常工作,因为您告诉NHibernate Child正在管理一对多关系,但是该子对象没有对其父对象的返回引用。 NHibernate没有办法告诉ParentId(一个int)是反向引用。 – 2010-12-03 01:39:49