我在使用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。
我希望我能让你明白这个问题。
你有什么想法如何应对吗?这是映射中的错误吗?这是一个错误吗? 提前谢谢!