C# Fluent-NHibernate级联删除问题

C# Fluent-NHibernate级联删除问题,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我对fluent nhibernate cascade delete有问题。我肯定我做错了什么,因为它不起作用 以下是我的物品: public class Parent { public int Id { get; set; } public IList<SequencedChild> SequencedChildren { get; set; } } public class SequencedChild { public int Id { get; s

我对fluent nhibernate cascade delete有问题。我肯定我做错了什么,因为它不起作用

以下是我的物品:

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; }
}
因此,我有一个具有一些已排序子对象的父对象,我希望更新该父对象,使其不具有子对象。当我在该父级上执行更新时,没有已排序的子级,我希望在我的
SequencedChild
表中,具有父级id的记录将被删除。但出于某种原因,NHibernate正试图用null更新这些记录的
ParentId
,但由于
ParentId
不为null,因此更新失败。编辑:我还希望子对象不受影响(行为正常)


我看了一些问题,它们都建议使用逆运算,但我已经在这么做了。我做错了什么?

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

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

因此,我找到了一个解决方案,其结果有多个步骤:

  • 正如James在评论中指出的,ParentId/ChildId应该是Parent/Child引用,而不仅仅是id(+1)
  • SequencedChild
    需要有一个显式映射,将cascade设置为none
  • 执行更新时,不要覆盖SequencedChild列表。首先清除它,然后添加新项目。(如果您不更换这些项目,则只需清除即可)
  • Inverse()
    调用不是必需的
  • db表中的
    ParentId
    字段应该可以为null,因为nHibernate坚持在删除它之前将其更新为null。(如果有人知道解决方法,请留言)

  • 因此,我设法找到了一个解决方案,该解决方案有多个步骤:

  • 正如James在评论中指出的,ParentId/ChildId应该是Parent/Child引用,而不仅仅是id(+1)
  • SequencedChild
    需要有一个显式映射,将cascade设置为none
  • 执行更新时,不要覆盖SequencedChild列表。首先清除它,然后添加新项目。(如果您不更换这些项目,则只需清除即可)
  • Inverse()
    调用不是必需的
  • db表中的
    ParentId
    字段应该可以为null,因为nHibernate坚持在删除它之前将其更新为null。(如果有人知道解决方法,请留言)

  • 问题是无法创建孤立项,因为ParentId为NotNull,并且NHibernate正在尝试将它们设置为null。SequencedChild类是否确实具有ParentId/ChildId而不是对父/子的引用?如果是这样的话,当您告诉NHibernate子对象正在管理一对多关系时,Inverse()将不起作用,但是子对象没有对其父对象的反向引用。NHibernate无法判断ParentId(int)是反向引用。问题是无法创建孤立项,因为ParentId不是null,NHibernate正在尝试将它们设置为null。SequencedChild类是否确实具有ParentId/ChildId而不是对父/子的引用?如果是这样的话,当您告诉NHibernate子对象正在管理一对多关系时,Inverse()将不起作用,但是子对象没有对其父对象的反向引用。NHibernate无法判断ParentId(int)是反向引用。您好,您是否尝试过使用Not.Nullable()标记对父级的引用?我有一个与您类似的场景,我在childs引用中添加了Not.Nullable(),这会将列创建为Not NULL。感谢您的提醒,我似乎也无法回避将外键列设置为NULL的必要性,感谢您帮助我确定在哪里工作@Joe,虽然这可能会将列创建为not null,但在运行时仍然失败,因为nhibernate会在删除行之前更新该行,使其具有null id。请您看看我的问题,我无法使其正常工作,看起来我也有相同的问题…您好,您是否尝试过使用not.Nullable()标记对父行的引用?我有一个与您类似的场景,我在childs引用中添加了Not.Nullable(),这会将列创建为Not NULL。感谢您的提醒,我似乎也无法回避将外键列设置为NULL的必要性,感谢您帮助我确定在哪里工作@Joe,虽然这可能会将列创建为非空,但在运行时仍然失败,因为nhibernate会在删除行之前更新该行,使其具有空id。请您看看我的问题,我无法使其工作,看起来我也有相同的问题。。。
    HasMany(m => m.SequencedChildren).Inverse().Cascade.Delete();