0

私のデータモデルは次のようになります。

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; } 
}

Fluent 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 をロードすると、Pivo​​tTableFields コレクションがロードされないことです。スローされた例外には、「プロキシ インスタンスの作成に失敗しました」というメッセージが表示されます。例外を詳しく調べると、Pivo​​tTableFields に「コレクションの読み込みへの不正なアクセス」と表示されていることがわかります。セッションが閉じられていないことを確認できます。遅延読み込みを使用しない場合でも、問題は解決しません。

私は他の場所で同様の種類のモデルとマッピングを使用しましたが、それらは正常に機能します。ここで何が間違っていますか?手がかりは大歓迎です!

4

1 に答える 1

0

問題が解決するかどうかはわかりませんが、とにかく PivotColumnFieldMap に DiscriminatorValue(x => x.FieldType ) を追加する必要があります

于 2012-09-05T10:33:02.217 に答える