没有持久性:Castle.Proxies。<entityname> NHibernate中的Proxy和lazy =“true”?</entityname>

时间:2011-06-22 02:58:26

标签: .net nhibernate nhibernate-mapping lazy-loading

我正在尝试对我的某个实体的属性使用延迟加载

属性映射是这样的:

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/>

但是当我要保存这个实体的实例(使用Linq)时,它会抛出一个带有以下内部异常的DatabaseQueryException:

NHibernate.MappingException:没有持久性:Castle.Proxies.FooEntityProxy“

当我删除lazy =“true”项时,异常不再被抛出。使用lazy =“true”有什么问题以及如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

我知道这是一个迟到的答案,但我之前遇到过同样的问题。我使用自定义拦截器来创建代理,因此我发现问题是我没有覆盖“GetEntityName”方法。在GetEntityName方法中分析代理,并返回正确的类名称就可以了。

就我而言,我有一个简单的扩展方法来解析我的对象,称为“UnProxy”,所以我对这个方法的整个实现看起来像这样:

public override string GetEntityName(object entity)
{
    if (entity == null)
        return base.GetEntityName(entity);
    return entity.UnProxy().GetType().FullName;
}

答案 1 :(得分:3)

您确定使用的是NHibernate 3吗?我认为只有这个版本支持标量属性延迟加载!

<强>更新

不确定它是否可以帮到你,但试着看看这里:

NHibernate lazy loading property - what does build-time bytecode instrumentation mean?

或在这里:

NHibernate lazy properties behavior?

答案 2 :(得分:2)

如果您将某个属性标记为惰性,则必须是虚拟自动属性(没有像public virtual MyType Baz { get; set; }这样的正文)。如果您尝试访问基础字段值,而不是通过该属性,则将绕过属性的延迟加载,并可能获得意外结果。