【问题标题】:NHibernate: nullable one-to-one association..?NHibernate:可为空的一对一关联..?
【发布时间】:2011-01-10 03:06:40
【问题描述】:

这是我第一次使用 NHibernate,我目前正在编写映射并重组我的应用程序中的对象,以便它们更清晰地映射。

我的情况有点像这样:

class A
{
    // Properties of A
    //..

    // References an instance of B (but can be null)
    public B BInstance { get; set; }
}

class B
{
    // Properties relevant to a particular instance of A
}

现在,这对我来说似乎是一对一的关联,但我在 NHibernate 文档中找不到关于可空的一对一关联是否真的可能的参考。

理想情况下,我的数据库中的“B 表”应该有一个“A_ID”列。 存在具有该 A_ID 的行将表明 A 的关联实例处于非空关联中。如果没有具有该 A_ID 的行,则表明关联为空。

我能想到映射它的唯一方法是从 A 映射一个集合(应用程序将其限制为 1 个或 0 个元素),但我想知道我是否缺少更明显的解决方案。

提前感谢您的帮助。

澄清一下:我使用的是普通的 NHibernate,而不是 Fluent。

【问题讨论】:

    标签: c# .net nhibernate


    【解决方案1】:

    您应该能够在映射中指定 References(x => x.BInstance).Nullable()(假设您使用的是 Fluent nHibernate)。

    【讨论】:

    • 糟糕的假设 :) (这是香草 NHibernate)
    • @Nick:你应该在你的问题中澄清这个信息。
    • 另外,我认为这会导致从 A 表到 B 表的额外外键引用(而不是所需的外连接设置)...
    • @Nick,已经有一个类似的问题然后stackoverflow.com/questions/244812/…
    • @HeavyWave,我去看看。
    【解决方案2】:

    最后我更改了模型,使其更紧密地映射到我试图实现的数据库架构。

    我通过在对象模型中建立双向的一对一关联来做到这一点。 (即,B 类还持有对其关联的 A 类的引用)。

    这允许直接使用 关联,该关联可以为空。

    【讨论】:

    • 你确定 可以为空吗?在这里似乎不起作用
    【解决方案3】:

    可以使用一对一元素进行可空的一对一映射。请参阅 http://ayende.com/Blog/archive/2009/04/19/nhibernate-mapping-ltone-to-onegt.aspx 了解 Ayende 的精彩总结。

    【讨论】:

      【解决方案4】:

      在 A 映射中你应该写:

      <many-to-one class="B" name="BInstance" column="a_ID" not-null="false"/>
      

      并在类中放入“B”类型的属性 BInstance。 not-null="false" 是默认值,我写的只是为了强制 B 可以按您的要求为空。

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        相关资源
        最近更新 更多