2012-09-05 54 views
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沒有關閉。如果我不使用延遲加載,問題仍然存在。

我在其他地方使用了類似的模型和映射,它們工作正常。我在這裏做錯了什麼? 任何線索將不勝感激!

回答

0

我不知道它是否解決了問題,但無論如何,你需要在PivotColumnFieldMap

+0

添加DiscriminatorValue(X => x.FieldType)我沒有做任何其他。我認爲DiscriminatorValue適用於Table Per Class方法。我爲所有類型使用單個表格,Discriminator列是PivotFieldType。 – Zuber

+0

你可以看看本文中https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping中的表 - 類 - 層次結構策略示例。如果在子類映射中未指定此值(可能是子類的類型),我不知道默認情況下保存在「Discriminate」列中的內容。對不起,如果我錯了,你需要指定DiscriminatorValue和nhibernate爲這個列中的每個子類寫一些默認值 –