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

时间:2009-06-12 06:02:41

标签: c# fluent-nhibernate nhibernate-mapping

所以一切都与基本的鉴别器映射很好地协调。我可以毫无问题地直接与实体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();            
        }
}

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

我已经经历了许多不同的可能解决方案,我不再知道什么不起作用。我觉得我不应该在集合中提供where子句,但事情对我来说不起作用。

任何线索都会受到赞赏。

1 个答案:

答案 0 :(得分: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,听起来更像是我的错误