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 中创建基实体和基类映射