0

这不是一个问题,只是为了未来......(花了很多时间来弄清楚)

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)会导致提到的错误。

使固定:

在 AMap 类中,您不需要该行:

Map(x => x.Type);

删除此持久性后工作正常

4

1 回答 1

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);
}
于 2013-10-18T12:05:35.093 回答