我有一种情况,我有一个包含3列的表,其中包含引用不同表的ID。除了这3列之外,我还有一些具有一些属性的列。
让我们说3列是Foo,Bar,Baz。 Foo永远不会为空,而Bar,Baz中只有一个为空。
我的实体和映射看起来像这样(请记住我想保持简单):
public class FooBarBaz
{
public virtual Foo Foo { get; set; }
public virtual Bar Bar { get; set; }
public virtual Baz Baz { get; set; }
public virtual string Prop { get; set; }
public override bool Equals(Object obj)
{
/* checks for nulls etc. in the end
returns Foo == obj.Foo && Bar == obj.Bar && Baz == obj.Baz */
}
public override int GetHashCode()
{
/* builds unique string for (Foo,Bar,Baz)
taking nulls into account and gets it's hashcode */
}
}
public class FooBarBazMap : ClassMap<FooBarBaz>
{
public FooBarBazMap()
{
CompositeId()
.KeyReference(x => x.Foo, "Foo_Id")
.KeyReference(x => x.Bar, "Bar_Id")
.KeyReference(x => x.Baz, "Baz_Id");
Map(x => x.Prop);
}
}
我手动创建了一行,其中所有三列都不为空,并且此映射完全正常。但是我的应用程序逻辑基于以下事实:两个中的一个(Bar,Baz)都是null,在这种情况下,NHibernate返回null作为FooBarBaz实体。
我该如何克服这个问题? NHibernate是否允许CompositeId中的空值?
答案 0 :(得分:4)
nhibernate是关系数据库之上的抽象,关系数据库不允许主键列中的空值(实际上所有pk列都没有空约束)。
假设此表是3个实体之间的链接表,我将其映射为组件。如果您在Foo bar和baz之间发布关联,我可以举个例子。