【问题标题】:NHibernate - Creating a proxy instance failedNHibernate - 创建代理实例失败
【发布时间】:2012-08-29 18:24:09
【问题描述】:

我的数据模型如下所示。

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 从数据库中加载数据透视表控件时,数据透视表字段集合没有被加载。 抛出的异常显示“创建代理实例失败”。深入研究异常,我可以看到 PivotTableFields 说“非法访问加载集合”。 我可以确认会话没有关闭。如果我不使用延迟加载,问题仍然存在。

我在其他地方使用过类似的模型和映射,它们运行良好。我在这里做错了什么? 任何线索将不胜感激!

【问题讨论】:

    标签: nhibernate castle-dynamicproxy lazy-initialization


    【解决方案1】:

    我不确定它是否能解决问题,但无论如何您需要在 PivotColumnFieldMap 中添加 DiscriminatorValue(x => x.FieldType )

    【讨论】:

    • 我不必为其他任何人这样做。我认为 DiscriminatorValue 是针对每类表的方法。我对所有类型都使用一个表,鉴别器列是 PivotFieldType。
    • 您能看一下本文github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping 中的table-per-class-hierarchy 策略示例吗?如果未在子类映射中指定此值(可能是子类的类型),我不知道默认情况下保存在“区分”列中的内容。对不起,如果我错了,您需要指定 DiscriminatorValue 和 nhibernate 为该列中的每个子类写一些默认值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-08-18
    • 2021-09-03
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多