【发布时间】: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();不得不使用这样的魔术字符串似乎不太理想。
-
我也可以确认这个问题。有人找到解决方案了吗?
标签: c# fluent-nhibernate nhibernate-mapping