2009-10-29 48 views
0

我遇到了一个问题,让FluentNHibernate的HasMany <>映射行为与我所期望的一样。HasMany <MySubtype>映射返回超类型和所有后代?

我有一个类的层次结构Child是Parent的后代,使用table-per-hierarchy定义,由名为'TYPE'的列中的类名进行区分。一个不相关的类Group包含一个Child元素的集合。

因此,集团类被定义为:

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

    public Group() 
    { 
     Children = new List<Children>(); 
    } 
} 

我在功能NHibernate地图看起来是这样的:

public class GroupMap : SubclassMap<Group> 
{ 
    public GroupMap() 
    { 
     HasMany<Child>(x => x.Children) 
      .Not.LazyLoad() 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

我预计使用Group.Children会导致集合中Child类型的对象,但它返回包含Parent或Child类型对象的集合。

看看生成的SQL,select语句不会根据保存Parent和Child对象的表中的TYPE列进行区分。

更改我的映射:

public class GroupMap : SubclassMap<Group> 
{ 
    public GroupMap() 
    { 
     HasMany<Child>(x => x.Children) 
      .Inverse() 
      .Not.LazyLoad() 
      .Where("Type = 'Child'") 
      .Cascade.All(); 
    } 
} 

解决了这个问题,但它似乎是一个黑客给我。不应该声明“的hasMany”推断的结果应该是唯一的类型的孩子?

我是不是正确映射我的收藏?

+0

我认为与每层次表您必须指定一个鉴别器 – mxmissile 2009-10-30 15:35:57

+0

我的流利地图为父/子层次包括DiscriminateSubClassesOnColumn (“Type”)声明。从我在t中看到的所有内容他的数据库,鉴别器在其他情况下正在被保存/读取。 DiscriminatorPart SubClass 在我的IDE中显示为已弃用,所以我很确定没有其他东西可以声明。我发现詹姆斯格雷戈里的评论指出使用类名作为鉴别值的字符串鉴别符是默认行为,这与我目前的经验相符。 – 2009-10-30 18:25:53

回答

0

简短的回答是,我使用FluentNHibernate映射搬走。

我回到使用普通的.hbm.xml映射,因此更加快乐