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

ber*_*rko 27 c# nhibernate-mapping fluent-nhibernate

所以一切都与基本的鉴别器映射很好地协调.我可以毫无问题地直接与实体A和B进行交互.

public class BaseType {}
public class EntityA : BaseType {}
public class EntityB : BaseType {}
Run Code Online (Sandbox Code Playgroud)

这在BaseType映射中没有戏剧性地映射为

DiscriminateSubClassesOnColumn<string>("Type")
               .SubClass<BaseType>("A", m => { })
               .SubClass<BaseType>("B", m => { });
Run Code Online (Sandbox Code Playgroud)

在以下情况下会出现问题:在聚合中,我们要将集合映射到每个子类

使用如下的映射

public class AggregateMap: BaseMap<Aggregate>
{
        public AggregateMap()
        {
                HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All();
                HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();            
        }
}
Run Code Online (Sandbox Code Playgroud)

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

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

任何线索将不胜感激.

Iai*_*ain 1

你的映射看起来很奇怪,特别是我认为它应该看起来更像这样

DiscriminateSubClassesOnColumn<string>("Type")
               .SubClass<EntityA>("A", m => { })
               .SubClass<EntityB>("B", m => { });
Run Code Online (Sandbox Code Playgroud)

话虽如此,该方法似乎已被弃用,您应该定义以下内容(取自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);
  }
} 
Run Code Online (Sandbox Code Playgroud)

但不确定这是否能解决这个问题,我还没有遇到你的情况。

编辑:这个问题也在这里提出,对我来说听起来更像是一个错误