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