2009-06-12 123 views
27

因此,一切工作都很好,基本鉴别器映射。我可以直接与实体A和B进行交互,没有任何问题。流利的NHibernate实体不同子类类型的HasMany集合

public class BaseType {} 
public class EntityA : BaseType {} 
public class EntityB : BaseType {} 

这没有在基本类型映射剧映射为

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<BaseType>("A", m => { }) 
       .SubClass<BaseType>("B", m => { }); 

时出现的问题:在聚合,我们要集合映射到每个子类

使用像下面

映射
public class AggregateMap: BaseMap<Aggregate> 
{ 
     public AggregateMap() 
     { 
       HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All(); 
       HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();    
     } 
} 

这些明显不是完整的映射,但是它是描述我所尝试的最小量。添加到ACollection和BCollection的项目在保存聚合时通过级联正确保持。但是,在检索汇总时,对类型歧视存在混淆。

我已经运行了很多不同的可能的解决方案,我不知道什么都不起作用。我觉得我不应该在集合上提供一个where子句,但事情对我来说并不合适。

任何线索,将不胜感激。

+0

错误通过“关于类型的歧视混乱”,你的意思是,这两个集返回所有的类型?不管他们的歧视? – 2009-06-12 07:44:38

+0

我现在已经离开工作,所以不记得确切的错误。像'无法加载EntityA类型的实体,因为它不匹配指定的EntityB'。 我们使用HasMany映射中的字符串在Where子句中入侵,并通过鉴别器列手动过滤。我只是认为这种类型会“流过”,而且决定将自动执行。 – berko 2009-06-12 07:58:56

+0

是的,要直接回答你的问题......我认为它试图加载所有类型,不管鉴别器如何。 – berko 2009-06-12 08:00:02

回答

1

您的映射看起来很奇怪,尤其是我觉得它应该这样

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<EntityA>("A", m => { }) 
       .SubClass<EntityB>("B", m => { }); 

说了这么多,似乎法计提折旧,你应该改为定义以下(从Automapping Subclasses采取:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 

    DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class ChildMap : SubclassMap<Child> 
{ 
    public ChildMap() 
    { 
    Map(x => x.AnotherProperty); 
    } 
} 

不知道这会虽然修复它,我还没有遇到你的情景。

编辑:这个问题也提出了here,听起来更像我

相关问题