NHibernate:向 child 级联保存不插入

标签 nhibernate fluent-nhibernate

我有一个像这样的双向关联:

public class Parent
{
  public int ParentId {get; set;}
  ...other properties
  public IEnumerable<Child> Children {get; set;}
}

public class Child
{
  public int ChildId {get; set;}
  ...other properties
  public Parent Parent {get; set;}
}

流畅的映射如下:

父映射
Id(x => x.ParentId, "PARENT_ID").GeneratedBy.Identity();
.. other mappings
HasMany(x => x.Children).Cascade.All().KeyColumn("PARENT_ID");

子映射
Id(x => x.ChildId, "CHILD_ID").GeneratedBy.Identity();
.. other mappings
References(x => x.Parent).Column("PARENT_ID").Cascade.None();

当我执行这样的代码时:
Parent parent = new Parent{ ..set some properties... };
parent.Children = new[] { new Child{ ..set some properties.. };
session.Save(parent);

我收到外键约束违规,因为 NHibernate 没有设置 PARENT_ID尝试插入子记录时,将子记录的列添加到新 ID。

显然,我已经请求在 Parent 的映射中进行级联。 . NHibernate 试图拯救 child ,但为什么没有设置 ID?

最佳答案

您需要进行两项更改。

  • 您需要 .Inverse()HasMany(x => x.Children) .见 my answer explaining inverse想要查询更多的信息。
  • 您还需要添加 child.Parent = parent;到保存实体的代码。

  • 在您的情况下,这两种关系相互冲突。 parent.Children包含 child ,这意味着 NHibernate 应该坚持 Child.PARENT_ID作为 parent 的 ID,但 child.Parent为空,意味着 NHibernate 应该坚持 Child.PARENT_ID为空。显然 child.Parent韩元。实际上,更有可能的是他们都赢了。 NHibernate 可能正在执行两个类似于这些的查询......
    /* This is what child.Parent says we should save.
       This query will fail because PARENT_ID is NOT NULL. */
    insert into Child (CHILD_ID, PARENT_ID) values (@childId, null);
    
    /* This is what parent.Children says we should save. */
    update Child set PARENT_ID = @parentId where CHILD_ID = @childId;
    

    如果您进行我上面推荐的两个更改,NHibernate 将能够正确保存它,如下所示:
    insert into Child (CHILD_ID, PARENT_ID) values (@childId, @parentId);
    

    关于NHibernate:向 child 级联保存不插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382383/

    相关文章:

    nhibernate - 如何使用 NHibernate(或 Fluent)检查表是否存在?

    c# - 使用 C# 和 Fluent Nhibernate 在 MySQL 中使用 DateTime 保存毫秒精度

    c# - Web 应用程序中的 NHibernate 查询策略

    c# - 如何将 daoFactory 注入(inject) NHibernate EventListener

    c# - NHibernate 和奇数 "Session is Closed!"错误

    c# - 我的 Fluent nHibernate 应用程序不是延迟加载

    c# - Fluent NHibernate 日期时间 UTC

    c# - 流利的 NHibernate : How to map an entire class as ReadOnly?

    NHibernate:DetachedCriteria 嵌套不止一次

    nhibernate - NHibernate 3.x的预生成代理?