.net 没有坚持者:城堡。代理。<;EntityName>;代理和懒惰=”;“真的”;在尼伯内特?

.net 没有坚持者:城堡。代理。<;EntityName>;代理和懒惰=”;“真的”;在尼伯内特?,.net,nhibernate,nhibernate-mapping,lazy-loading,.net,Nhibernate,Nhibernate Mapping,Lazy Loading,我正在尝试对我的一个实体的属性使用延迟加载 属性映射如下所示: <property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/> public override string GetEntityName(object entity) { if (entity == null) return base.GetEntityName(entity); return entity.

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

属性映射如下所示:

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/>
public override string GetEntityName(object entity)
{
    if (entity == null)
        return base.GetEntityName(entity);
    return entity.UnProxy().GetType().FullName;
}

但是,当我尝试保存此实体的实例(使用Linq)时,它会抛出一个DatabaseQueryException,其中包含以下内部异常:

NHibernate.MappingException
:Castle.Proxies.FooEntityProxy没有持久化程序”


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

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

更新

不确定它是否能帮助您,但请尝试查看以下内容:

或在此:


如果将属性标记为lazy,则该属性必须是虚拟自动属性(没有类似于
公共虚拟MyType Baz{get;set;}
)。如果您尝试访问基础字段值,而不是遍历属性,您将避免延迟加载属性,并可能会得到意外结果。

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

在我的例子中,我有一个简单的扩展方法来解除对象的固定,称为“unproxy”,因此我对该方法的整个实现如下所示:

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/>
public override string GetEntityName(object entity)
{
    if (entity == null)
        return base.GetEntityName(entity);
    return entity.UnProxy().GetType().FullName;
}

在您的会话中,该属性发生了什么,是否已加载?您是否在会话中对其进行了修改?@Pedro Assembly Version是3.1is FooEntity子类,可能这就是问题所在…什么是虚拟自动属性?没有主体的虚拟属性,例如
公共虚拟SomeType Foo{get;set;}