复合Id在NHibernate中包含空值

时间:2012-03-15 14:52:31

标签: c# nhibernate orm fluent-nhibernate

我有一种情况,我有一个包含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中的空值?

1 个答案:

答案 0 :(得分:4)

nhibernate是关系数据库之上的抽象,关系数据库不允许主键列中的空值(实际上所有pk列都没有空约束)。

假设此表是3个实体之间的链接表,我将其映射为组件。如果您在Foo bar和baz之间发布关联,我可以举个例子。