0
我的数据模型看起来像这样。NHibernate - 创建代理实例失败
public abstract class BasePivotField
{
public virtual int SystemId { get; set; }
public virtual int Version { get; set; }
public virtual string FieldName { get; set; }
public virtual string FieldValuePrefix { get; set; }
public virtual Field Field { get; set; }
public abstract PivotFieldType FieldType { get; }
}
public class PivotColumnField : BasePivotField
{
public virtual CriteriaWithField FieldCriteria { get; set; }
public virtual int Width { get; set; }
public override PivotFieldType FieldType
{
get { return PivotFieldType.ColumnField; }
}
}
public class PivotTableControl : BaseControl
{
public virtual Criteria Criteria { get; set; }
public virtual int Height { get; set; }
public virtual PagingProperties PagingProperties { get; set; }
public virtual IList<BasePivotField> PivotTableFields { get; set; }
}
我用流利的NHibernate的映射和映射类低于
public class PivotTableControlMap : SubclassMap<PivotTableControl>
{
public PivotTableControlMap()
{
References(x => x.Criteria).Cascade.All().Column("PivotTableCriteria");
Map(x => x.Height);
Component(x => x.PagingProperties);
HasMany(x => x.PivotTableFields)
.KeyColumn("PivotTableId")
.Cascade.AllDeleteOrphan()
.AsBag();
}
}
public class PivotTableFieldMap : ClassMap<BasePivotField>
{
public PivotTableFieldMap()
{
Table("PivotTableField");
Id(x => x.SystemId);
Version(x => x.Version);
Map(x => x.FieldName);
References(x => x.Field).Cascade.All().Column("FieldId");
Map(x => x.FieldValuePrefix);
DiscriminateSubClassesOnColumn("PivotFieldType");
}
}
public class PivotColumnFieldMap : SubclassMap<PivotColumnField>
{
public PivotColumnFieldMap()
{
Component(x => x.FieldCriteria).ColumnPrefix("PivotTable");
Map(x => x.Width);
}
}
有迹象表明,从BasePivotField继承其他类,但我已经离开他们出去简洁。
问题是,当我使用NHibernate从数据库加载PivotTableControls时,PivotTableFields集合不会被加载。 抛出的异常说'创建代理实例失败'。深入研究异常情况,我可以看到PivotTableFields说'非法访问加载收集'。 我可以确认Session没有关闭。如果我不使用延迟加载,问题仍然存在。
我在其他地方使用了类似的模型和映射,它们工作正常。我在这里做错了什么? 任何线索将不胜感激!
添加DiscriminatorValue(X => x.FieldType)我没有做任何其他。我认为DiscriminatorValue适用于Table Per Class方法。我为所有类型使用单个表格,Discriminator列是PivotFieldType。 – Zuber
你可以看看本文中https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping中的表 - 类 - 层次结构策略示例。如果在子类映射中未指定此值(可能是子类的类型),我不知道默认情况下保存在“Discriminate”列中的内容。对不起,如果我错了,你需要指定DiscriminatorValue和nhibernate为这个列中的每个子类写一些默认值 –