NHibernate.LazyInitializationException: Initializing[] - 无法初始化代理 - 没有会话

Posted

技术标签:

【中文标题】NHibernate.LazyInitializationException: Initializing[] - 无法初始化代理 - 没有会话【英文标题】:NHibernate.LazyInitializationException: Initializing[]-Could not initialize proxy - no Session 【发布时间】:2021-05-06 10:31:16 【问题描述】:

ASP.NET 网站。 不断收到异常LazyInitializationException: ... - 无法初始化代理 - 没有会话。

NHibernate.LazyInitializationException: Initializing[MyProj.MyClass#XXX]-Could not initialize proxy - no Session.   
   at NHibernate.Proxy.AbstractLazyInitializer.Initialize()
   at NHibernate.Proxy.DefaultLazyInitializer.Intercept(InvocationInfo info)
   at MyClassProxy.get_MyProjerty()

【问题讨论】:

有人建议我删除这个问题,因为我在 google ***.com/questions/7584315/… 上找到了这个问题吗?不完全一样,但我可以尝试在那里发布我的答案。 【参考方案1】: 缓存 加上延迟加载 加上每个请求的会话关闭

我们已经缓存了 NHibernate 实体,但是缓存 ORM 对象是一个危险的想法。

我们可以这样做

将 ORM 实体对象转换为自定义受限 POCO(普通旧 CLR 对象)并将其用于缓存。 对于具有多对多或一对多关系的大型实体对象,以下内容是危险的。 为单个请求禁用延迟加载(如果可能)。 使用一些深层克隆来创建深层副本。 从上下文中分离 ORM 实体对象。但是延迟加载属性可以保持为空。

请记住,如果有人启用或禁用延迟加载,您将在很长一段时间内遇到麻烦。或者有人可能以意想不到的方式管理会话生命周期。或者,如果数据库连接中断,会话可能会损坏。

我还不知道大家会选择什么来解决这个问题。

【讨论】:

以上是关于NHibernate.LazyInitializationException: Initializing[] - 无法初始化代理 - 没有会话的主要内容,如果未能解决你的问题,请参考以下文章