NHibernate中包含null值的复合Id
本文关键字:复合 Id null 包含 NHibernate | 更新日期: 2023-09-27 18:27:50
我有一种情况,我有一个包含3列的表,其中包含引用不同表的ID。除了这3列之外,我还有一些列具有一些属性。
假设这3列是Foo、Bar和Baz。Foo从来都不是null,而正是Bar,Baz中的一个是null。
我的实体和映射看起来是这样的(请记住,我想保持简单):
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);
}
}
我手动创建了一行,其中所有三列都不为null,并且这种映射工作得非常好。但我的应用程序逻辑是基于这样一个事实,即两者中总是有一个(Bar,Baz)为null,在这种情况下,NHibernate将返回null作为FooBarBaz实体。
我该如何克服这个问题?NHibernate是否允许CompositeId中的null值?
nhibernate是关系数据库之上的抽象,关系数据库不允许主键列中有null值(事实上,所有pk列都没有null约束)。
假设这个表是3个实体之间的链接表,我会将其映射为一个组件。如果你发布Foo酒吧和baz之间的关联,我可以举一个例子。