c# - Fluent NHibernate 级联删除问题

标签 c# nhibernate fluent-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 试图用 null 更新这些记录的 ParentId - 由于 ParentId 不为 null 而失败。 编辑:我还希望 Child 对象不受影响(其行为正确)。

我看了几个问题,它们都建议使用 inverse,但我已经在这样做了。我做错了什么?

最佳答案

所以我设法找到了一个有多个步骤的解决方案:

  1. 正如 James 在评论中指出的那样,ParentId/ChildId 应该是父/子引用,而不仅仅是 ID(为此 +1)
  2. SequencedChild 需要有一个将 cascade 设置为 none 的显式映射
  3. 进行更新时,不要覆盖 SequencedChild 列表。首先清除它然后添加新项目。 (或者如果您不更换元素,只需清除)
  4. Inverse() 调用不是必需的
  5. db 表中的 ParentId 字段应该可以为 null,因为 nHibernate 坚持在删除它之前将其更新为 null。 (如果有人知道解决这个问题的方法,请发表评论)

关于c# - Fluent NHibernate 级联删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4341578/

相关文章:

c# - activeSelf 返回 true 且 gameobject 为 false

c# - SQLite CreateTable with Class<T> 没有特定的 T

c# - ulong 和 long 之间不可能的比较突然成为可能

NHibernate:在运行时访问配置属性(Sql 方言)

nhibernate - 为什么Fluent NHibernate不理会我的约定?

c# - 带按钮的用户控件 - 当 uc 动态添加到另一个页面时

nhibernate - 创建一个 NHibernate 对象并初始化一个 Set

c# - 如何有效地将 100s 到 1000s 的操作记录到数据库

nhibernate - 在 Fluent NHibernate 中将 1 映射到 0..1

c# - 带外键的 Fluent nHibernate "not-null property references a null or transient value"