Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent NHibernate实体有许多不同子类类型的集合_C#_Fluent Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# Fluent NHibernate实体有许多不同子类类型的集合

C# Fluent NHibernate实体有许多不同子类类型的集合,c#,fluent-nhibernate,nhibernate-mapping,C#,Fluent Nhibernate,Nhibernate Mapping,因此,使用基本的鉴别器映射,一切都很顺利。我可以直接与实体A和B交互,没有任何问题 public class BaseType {} public class EntityA : BaseType {} public class EntityB : BaseType {} 此映射在基类型映射中没有戏剧性,如下所示 DiscriminateSubClassesOnColumn<string>("Type") .SubClass<BaseType&g

因此,使用基本的鉴别器映射,一切都很顺利。我可以直接与实体A和B交互,没有任何问题

public class BaseType {}
public class EntityA : BaseType {}
public class EntityB : BaseType {}
此映射在基类型映射中没有戏剧性,如下所示

DiscriminateSubClassesOnColumn<string>("Type")
               .SubClass<BaseType>("A", m => { })
               .SubClass<BaseType>("B", m => { });
discrimitesubclassesoncolumn(“类型”)
.子类(“A”,m=>{})
.子类(“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();            
        }
}
公共类聚合映射:BaseMap
{
公共聚合映射()
{
HasMany(x=>x.ACollection).AsSet().Cascade.All();
HasMany(x=>x.BCollection).AsSet().Cascade.All();
}
}
这些显然不是完整的映射,但它们是描述我正在尝试的内容的最小数量。保存聚合时,添加到ACollection和BCollection的项将通过级联正确持久化。然而,在检索聚合时,类型识别存在混淆

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


任何线索都将不胜感激。

您的地图看起来很奇怪,特别是我认为它应该看起来更像这样

DiscriminateSubClassesOnColumn<string>("Type")
               .SubClass<EntityA>("A", m => { })
               .SubClass<EntityB>("B", m => { });
discrimitesubclassesoncolumn(“类型”)
.子类(“A”,m=>{})
.子类(“B”,m=>{});
话虽如此,该方法似乎已折旧,您应定义以下内容(摘自:

公共类父映射:类映射
{
公共ParentMap()
{
Id(x=>x.Id);
Map(x=>x.Name);
区分子类子列(“类型”);
}
}
公共类ChildMap:子类映射
{
公共儿童地图()
{
Map(x=>x.AnotherProperty);
}
} 
不确定这是否会解决它,但我还没有遇到你的情况


编辑:这个问题也被提出了,对我来说更像是一个错误

“关于类型识别的混淆”,你的意思是两个集合都返回所有类型吗?不管它们的鉴别器是什么?我现在已经离开了工作,所以记不起确切的错误。类似于“无法加载EntityA类型的实体,因为它与指定的EntityB不匹配”。我们在HasMany映射上使用字符串入侵了Where子句,并通过鉴别器列。我只是认为类型将“流经”,并且将自动执行where决策。是的,直接回答您的问题…我认为它正在尝试加载所有类型,而不考虑鉴别器。您是否找到了解决方案?我们遇到了完全相同的问题,等等我们发现的唯一解决办法是在您提到的映射中添加一个where子句。例如,HasMany(x=>x.ACollection)。where(“[Type]='TypeA'))。AsSet().Cascade.All();必须使用这样的神奇字符串似乎不太理想。我也可以确认这个问题。有人找到解决方案吗?
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);
  }
}