这是我第一次使用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,而不是流利。
答案 0 :(得分:2)
您应该能够在映射中指定引用(x => x.BInstance).Nullable()(假设您使用的是Fluent nHibernate)。
答案 1 :(得分:1)
最后,我改变了模型,使其更紧密地映射到我试图实现的数据库模式。
我通过在对象模型中进行双向一对一关联来实现这一点。 (即,B班也提到了其相关的A类)。
这允许直接使用<一对一约束=“真”/>协会,可以为空。
答案 2 :(得分:0)
使用一对一元素可以实现可以为空的一对一映射。有关Ayende的详细摘要,请参阅http://ayende.com/Blog/archive/2009/04/19/nhibernate-mapping-ltone-to-onegt.aspx。
答案 3 :(得分:0)
在A映射中你应该写:
<many-to-one class="B" name="BInstance" column="a_ID" not-null="false"/>
并且在类中放置了类型为“B”的属性BInstance。 not-null =“false”是默认值,我写的只是为了强制执行B可以按你的要求为空。