Fluent nhibernate Fluent NHiberate自动映射-每个表的继承不写入鉴别器列

Fluent nhibernate Fluent NHiberate自动映射-每个表的继承不写入鉴别器列,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,使用 NHibernate:3.3.2 Fluent NHibernate:1.3.0 .NET4.0 大家好,我正在尝试使用自动映射为Fluent NHibernate创建一个(非常)简单的参考项目,特别是设置每个层次继承的表。我试着从一个现有的(正在工作的)项目复制配置,我在Fluent Wiki页面上运行了关于自动映射和继承的示例,两者都给出了相同的结果;我用table per hirearchy设置的基类被视为常规类 域模型如下所示: 命名空间测试 { 公共抽象类动物 { 公共虚拟整数I

使用 NHibernate:3.3.2 Fluent NHibernate:1.3.0 .NET4.0

大家好,我正在尝试使用自动映射为Fluent NHibernate创建一个(非常)简单的参考项目,特别是设置每个层次继承的表。我试着从一个现有的(正在工作的)项目复制配置,我在Fluent Wiki页面上运行了关于自动映射和继承的示例,两者都给出了相同的结果;我用table per hirearchy设置的基类被视为常规类

域模型如下所示:

命名空间测试
{
公共抽象类动物
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟整数{get;set;}
}
公共类猫:动物{}
公共类鹦鹉:动物{}
}
就像我说的,很简单,只是为了说明继承。我知道“legs”可能应该在基类上被重写:)

自动映射配置如下所示:

公共类自动映射配置:默认自动映射配置
{
公共覆盖布尔ShouldMap(类型)
{
var include=类型IsubClassof(类型(动物));
WriteLineIf(include,string.Format(“在NHibernate映射中包含{0}.”,type));
回报包括;
}
公共覆盖布尔值已区分(类型)
{
var result=type.In(
(类别),,
(种类(鹦鹉))
);
返回结果;
}
}
最后,配置/会话创建如下所示:

public静态会话NewSession()
{
var cfg=新的自动映射配置();
var map=AutoMap.AssemblyOf有点让人困惑,因为它首先谈到使用.IgnoreBase,所以NHibernate不会将基本身视为实体,然后在使用抽象层超类型时提到使用.Includebase。我两个都试过了,但没有Firo的回答,就没有运气。

你忘记了吗

public override bool IsDiscriminated(Type type)
{
    return typeof(Animal).IsAssigneableFrom(type);
}

谢谢,但是不行。我添加了那一行,并在上面设置了一个断点,然后看到它只被调用了两次——一次用于cat,一次用于budge,但从来没有用于animal。啊哈!我还需要更改另外两件事。a)ShouldMap方法需要为base(animal)类返回true。我假设该类型为。IsSubClassOf(type)对于子类也将返回true。b).IgnoreBase()需要更改为.IncludeBase()。为帮助干杯:)因此,总之,当使用table per hirearchy时,您确实需要包含抽象超类型,您需要告诉Fluent您希望映射它,并且需要告诉Fluent它已被区分(以及子类)。