使用子类共享关系的子类映射的NHibernate问题

时间:2011-03-01 10:33:24

标签: nhibernate fluent-nhibernate nhibernate-mapping single-table-inheritance

我在使用NHibernate实现以下场景时遇到了问题:

有一个表Foo,其列为Foo_Id,Foo_RefType,Foo_RefId。根据Foo_RefType(我们的鉴别器列,'BAR'或'BAZZ')中的值,我们与表Bar(Bar_Id,...)或Bazz(Bazz_Id,...)有关系。

这个关系模型应该映射到这些类:

public abstract class Foo : BaseEntity
{
    public virtual long Id { get; set; }
}

public class FooBar : Foo
{
    public Bar Bar { get; set; }
}

public class FooBazz : Foo
{
    public Bazz Bazz { get; set; }
}

public class Bar : BaseEntity { ... }

public class Bazz : BaseEntity { ... }

为了实现这一点,下面的映射(每个层次结构一个表)是流利地定义的:

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Table("Foo");
        Id(f => f.Id, "Foo_Id");
        DiscriminateSubclassesOnColumn<string>("Foo_RefType");
    }
}

public class FooBarMap : SubclassMap<FooBar>
{
    public FooBarMap()
    {
        DiscriminatorValue("BAR");
        References(f => f.Bar).ForeignKey("Foo_RefId");
    }
}

public class FooBazzMap : SubclassMap<FooBazz>
{
    public FooBazzMap()
    {
        DiscriminatorValue("BAZZ");
        References(f => f.Bazz).ForeignKey("Foo_RefId");
    }
}

呼。此映射编译。但是,让我们尝试以下代码段:

// ...
session.SaveOrUpdate(new FooBar{Bar = _someBar});
session.SaveOrUpdate(new FooBazz{Bazz = _someBazz});
session.Flush();
// ...

NHibernate正确创建第一个插入。但是对于第二个语句,NHibernate重新使用标识符BAR_ID而不是BAZZ_ID!如果两个语句都被切换,则同样如此,然后NHibernate在生成的第二个插入语句中重新使用BAZZ_ID而不是BAR_ID。

我希望我能让你明白这个问题。

你有什么想法如何应对吗?这是映射中的错误吗?这是一个错误吗? 提前谢谢!

0 个答案:

没有答案