这不是一个问题,只是为了将来......(花了很多时间才弄明白)
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后工作正常
答案 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);
}