通过nhibernate加载基类会错误地使用派生类的映射

通过nhibernate加载基类会错误地使用派生类的映射,nhibernate,inheritance,fluent-nhibernate,mapping,Nhibernate,Inheritance,Fluent Nhibernate,Mapping,我有一个场景,其中我有一个基类作为一个实体,然后是从另一个基类派生的另一个实体。两者在我的领域中都有意义,可以单独使用 public class MyBaseClass { int ID { get; set; } string Name { get; set; } } public class MyChildClass { string AdditionalField { get; set; } } 我已经使用Fluent nHibernate和ClassMap映射

我有一个场景,其中我有一个基类作为一个实体,然后是从另一个基类派生的另一个实体。两者在我的领域中都有意义,可以单独使用

public class MyBaseClass
{
    int ID { get; set; }
    string Name { get; set; }
}

public class MyChildClass
{
    string AdditionalField { get; set; }
}
我已经使用Fluent nHibernate和ClassMap映射了这两个对象,如下所示:

public class MyBaseClassMap : ClassMap<MyBaseClass>
{
   Id("MyBaseClassID");
   Map(x => x.Name);
}

public class MyChildClassMap : SubclassMap<MyChildClass>
{
   Map(x => x.AdditionalField);
}
公共类MyBaseClassMap:ClassMap
{
Id(“MyBaseClassID”);
Map(x=>x.Name);
}
公共类MyChildClassMap:子类映射
{
Map(x=>x.AdditionalField);
}

当我尝试获取基类的一个副本时,会发生什么,它使用子类的映射。它好像不知道基类和子类之间的区别,或者它为它选择了错误的映射。我通过观察SQL语句及其与子表的连接并获取附加列来确认这一点。有没有办法使用正确的地图呢?

这就是NHibernate的“本质” 您描述的行为称为“多态查询”

由于
MyChildClass
MyBaseClass
,因此也会检索MyChildClass实例


如果您想避免这种行为,您可以查看中的答案。(我从未“禁用”多态查询功能)。

“选择未中断”。NHibernate的行为完全符合文件规定。这非常有效。我刚刚在我的子类映射中添加了多态性.Explicit(),现在它可以正常工作了。谢谢