NHibernate:将子类化实体保留到主表(每个类策略问题的表)

时间:2013-09-12 22:10:16

标签: nhibernate fluent-nhibernate mapping table-per-class

这不是一个问题,只是为了将来......(花了很多时间才弄明白)

public class A
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}

public class B : A
{
    public string Lastname { get; set; }
}

映射(流利的NHibernate):

public class AMap : ClassMap<A>
{
    Table("a");
    Id(x => x.Id).GeneratedBy.Native();
    Map(x => x.Name);
    Map(x => x.Type);

    DiscriminateSubClassesOnColumn<string>("Type")
            .AlwaysSelectWithValue();
}

public class BMap : ClassMap<B>
{
   DiscriminatorValue("BType");
   Extends<A>();
   Map(x => x.Lastname);
}

持久化BMap对象会导致异常:

例外:

Error dehydrating property value for A.Lastname

内部例外:

Invalid index 1 for this SqlParameterCollection with Count=1

这个不明显的例外表明发生了一些映射错误配置。实际上“选择”查询工作得很好。但是“插入到”(ISession.SaveOrUpdate)会导致提到的错误。

FIX:

在AMap课程中,您不需要该行:

Map(x => x.Type);

删除此persister后工作正常

1 个答案:

答案 0 :(得分:0)

类型不需要在类中也不需要映射为属性,它是数据库中的实现细节以区分类型。而不是Extends SubclassMap更合适:

public class AMap : ClassMap<A>
{
    Table("A");
    Id(x => x.Id).GeneratedBy.Native();
    Map(x => x.Name);

    DiscriminateSubClassesOnColumn<string>("Type", "AType")
            .AlwaysSelectWithValue();
}

public class BMap : SubclassMap<B>
{
   DiscriminatorValue("BType");
   Map(x => x.Lastname);
}