Fluent NHibernate 实体 HasMany 不同子类类型的集合

Posted

技术标签:

【中文标题】Fluent NHibernate 实体 HasMany 不同子类类型的集合【英文标题】:Fluent NHibernate entity HasMany collections of different subclass types 【发布时间】:2010-11-02 09:09:54 【问题描述】:

因此,基本判别器映射一切正常。我可以毫无问题地直接与实体 A 和 B 交互。

public class BaseType 
public class EntityA : BaseType 
public class EntityB : BaseType 

这在 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();            
        

这些显然不是完整的映射,但却是描述我正在尝试的最小数量。保存 Aggregate 时,添加到 ACollection 和 BCollection 的项目会通过级联正确持久化。但是,在检索聚合时,类型区分会出现混淆。

我已经经历了很多不同的可能解决方案,我不再知道哪些是行不通的。我觉得我不应该在集合上提供 where 子句,但事情对我不起作用。

任何线索将不胜感激。

【问题讨论】:

“对类型区分的混淆”是指两个集合都返回所有类型吗?不管他们的歧视者是什么? 我现在已经下班了,所以不记得确切的错误了。诸如“无法加载 EntityA 类型的实体,因为它与指定的 EntityB 不匹配”之类的东西。我们使用 HasMany 映射上的字符串破解了 Where 子句,并且通过鉴别器列手动过滤。我只是认为类型会“流过”,并且会自动执行决策位置。 是的,直接回答你的问题......我认为它正在尝试加载所有类型,而不管鉴别器如何。 您找到解决方案了吗?我们遇到了完全相同的问题,我们发现的唯一解决方法是在您提到的映射中添加 where 子句。例如HasMany(x => x.ACollection).Where("[Type] = 'TypeA'").AsSet().Cascade.All();不得不使用这样的魔术字符串似乎不太理想。 我也可以确认这个问题。有人找到解决方案了吗? 【参考方案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,听起来更像是一个错误

【讨论】:

以上是关于Fluent NHibernate 实体 HasMany 不同子类类型的集合的主要内容,如果未能解决你的问题,请参考以下文章

Fluent nHibernate 保存或更新派生实体

Fluent NHibernate 自动映射:一对多实体,多对多后端?

Fluent Nhibernate将集合映射到通用实体

如何在 Fluent NHibernate 中创建基实体和基类映射

使用 Fluent NHibernate Auto Mapping 从基实体类映射类型对象的 ID

Fluent NHibernate使用我的用户名作为前缀创建表