Fluent nhibernate 有许多<;MySubtype>;映射返回超类型和所有子体?

Fluent nhibernate 有许多<;MySubtype>;映射返回超类型和所有子体?,fluent-nhibernate,Fluent Nhibernate,我在获取FluentNHibernate的映射时遇到了一个问题,因为它有许多映射要像我所期望的那样工作 我有一个类层次结构,Child是父类的后代,使用每个层次结构的表定义,通过名为“TYPE”的列中的类名进行区分。不相关的类组包含子元素的集合 因此,组类定义为: public class Group { public virtual IList<Child> Children {get; protected set;} public Group() {

我在获取FluentNHibernate的映射时遇到了一个问题,因为它有许多映射要像我所期望的那样工作

我有一个类层次结构,Child是父类的后代,使用每个层次结构的表定义,通过名为“TYPE”的列中的类名进行区分。不相关的类组包含子元素的集合

因此,组类定义为:

public class Group
{
    public virtual IList<Child> Children {get; protected set;}

    public Group()
    {
        Children = new List<Children>();
    }
}
公共类组
{
公共虚拟IList子项{get;protected set;}
公共组()
{
Children=新列表();
}
}
我在Fluent NHibernate中的地图如下所示:

public class GroupMap : SubclassMap<Group>
{
    public GroupMap()
    {
        HasMany<Child>(x => x.Children)
            .Not.LazyLoad()
            .Inverse()
            .Cascade.All();
    }
}
公共类GroupMap:子类Map
{
公共组映射()
{
有很多(x=>x个孩子)
.Not.LazyLoad()
.Inverse()
.Cascade.All();
}
}
我希望使用Group.Children会产生Child类型的对象集合,但它返回的集合包含Parent或Child类型的对象

查看生成的SQL,select语句不会根据表中包含父对象和子对象的类型列进行区分

将我的映射更改为:

public class GroupMap : SubclassMap<Group>
{
    public GroupMap()
    {
        HasMany<Child>(x => x.Children)
            .Inverse()
            .Not.LazyLoad()
            .Where("Type = 'Child'")
            .Cascade.All();
    }
}
公共类GroupMap:子类Map
{
公共组映射()
{
有很多(x=>x个孩子)
.Inverse()
.Not.LazyLoad()
.Where(“类型=‘子’”)
.Cascade.All();
}
}
解决了这个问题,但对我来说这似乎是一个难题。声明“HasMany”不应该推断结果应该是Child类型吗


我是否正确映射了我的集合?

简而言之,我已经不再使用FluentNHibernate映射


我又开始使用plain.hbm.xml映射了,结果更开心了。

我认为对于每个层次结构的表,必须指定一个鉴别器。我的父/子层次结构的流畅映射包括鉴别器SubClasseSoncolumn(“类型”)声明。从我在数据库中看到的一切来看,鉴别器在其他情况下被正确保存/读取。鉴别器Part子类在我的IDE中显示为已弃用,因此我非常确定没有其他东西需要声明。我发现James Gregory的一条注释,指出使用类名的字符串鉴别器因为鉴别器值是默认行为,这与我迄今为止的经验相符。