【问题标题】:NHibernate Parent/Child relationNHibernate 父/子关系
【发布时间】:2010-01-06 14:10:48
【问题描述】:

我有以下设置:

public class ParentEntity
{
   public ICollection<ChildEntity> {get; set; }
}

public class ChildEntity
{
   // do i need to the parent here?
}

我设法保存了 ParentEntity 并将保存级联到已保存的添加的子实体。但是在 db 表中,孩子的 ParentId 引用被设置为允许 NULL。将其设置为 NOT NULL 时,保存失败,因为子表中的 ParentId 为 NULL。

那里发生了什么? ;)

【问题讨论】:

  • 1.您不需要父母进行映射。也许你需要它来做别的事情? 2.如果你不告诉你是如何做mappig的,我们无法给你答案

标签: nhibernate


【解决方案1】:

你应该正常映射关系的两边,当你添加一个孩子到父母的集合时,你也应该在孩子上设置父属性。通常,您可以通过编写如下方法来实现:

public void AddChild(ChildEntity child)
{
   this.Children.Add(child);
   child.Parent = this;
}

NHibernate 根据 ChildEntity 类中的映射属性在 Child 表中持久化 ParentId 列。一对多关系的定义仅仅允许NHibernate根据该列中的值从数据库中加载集合

【讨论】:

  • 您通常不会这样做。当您对所有内容执行此操作时,几乎所有实体都将相互耦合(当应用程序变大时会出现意大利面条代码),并且无法使用有界上下文。有些关系需要是双向的,尤其是当父子节点都是聚合根时,但是当父节点负责它的子节点时,大多数时候,单向关系会更好。
【解决方案2】:

我遇到了同样的问题,需要让 nHibernate 公开外键列,或者通过集合在课堂上进行。

问题:nHibernate 创建集合对象(例如 IList),您无法覆盖或监听基本集合的添加事件。

这成为一个问题只是因为它是 WCF RIA 服务框架所要求的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多