【问题标题】:Fluent NHibernate: foreign key field not being set in unidirectional associationFluent NHibernate:未在单向关联中设置外键字段
【发布时间】:2010-11-29 09:54:57
【问题描述】:

我有一个带有 ProbateCases 表和 Properties 表的数据库。 Properties 表对 ProbateCases 表有一个称为 ProbateCaseId 的外键,因此 ProbateCases 和 Properties 之间的关系是一对多的。

我的域层有一个 ProbateCase 类和一个 Property 类。 ProbateCase 类具有如下定义的属性集合:

private IList<Property> _properties = new List<Property>();
public virtual IEnumerable<Property> Properties { get { return _properties; } }
public virtual Property AddProperty()
    {
      Property property = new Property();
      _properties.Add(property);
      return property;
    }

Fluent NHibernate 映射的对应部分如下所示:

HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore);

请注意,关联是单向的 - ProbateCase 类具有属性集合,但 Property 类没有 ProbateCase 成员。

我发现查询工作正常 - NHibernate 正在创建适当的 SQL 以获取具有适当 ProbateCaseId 值的属性。

但是,当我保存已添加新属性的 ProbateCase 时,INSERT SQL 不包含外键字段的值 - 所以我收到一个 SQL 异常,抱怨外键中有 NULL 值:

INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value???

我应该期望 NHibernate 自己填充外键值,还是我应该做其他事情?

【问题讨论】:

    标签: nhibernate fluent-nhibernate foreign-keys associations


    【解决方案1】:

    来自http://nhibernate.info/doc/nh/en/index.html#collections-onetomany

    非常重要的注意事项:如果关联的列被声明为 NOT NULL,NHibernate 在创建或更新关联时可能会导致违反约束。为防止此问题,您必须使用与标记为 inverse="true" 的多值端(集合或包)的双向关联。请参阅本章后面对双向关联的讨论。

    【讨论】:

    • 谢谢迭戈。我以前看过这个,但这对我来说真的没有意义。这不是 FK 字段是否可以为空的问题。我需要由 NHibernate 设置该字段,但它不是。我不知道为什么。无论如何,我已经通过使关联双向修复它(如所示),但这是一个 hack,因为能够从 Property 访问 ProbateCase 在语义上并没有真正意义。
    • 如果它让你感觉更好,每个人 都认为这应该可以工作而不是双向的(我知道它已经在 J​​ava Hibernate 中工作了一段时间)。这只是当前实现的一个限制。
    • 感谢您的澄清。为了其他读者的利益,您可以在 NHibernate 中进行单向关联,但只能采用两种可能方式中的一种。您必须进行“A 类有一个 B 类”关联,而不是“B 类有多个 A 类”关联。
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多