【问题标题】:Fluent NHibernate entity HasMany collections of different subclass typesFluent NHibernate 实体 HasMany 不同子类类型的集合
【发布时间】: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


【解决方案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,听起来更像是一个错误

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2011-02-02
    • 2012-04-03
    相关资源
    最近更新 更多