【问题标题】:NHibernate - Found shared references to a collectionNHibernate - 找到对集合的共享引用
【发布时间】:2016-01-11 17:06:53
【问题描述】:

在我的 ASP.NET webforms 应用程序中,我主要遇到了上述异常,以及:
- 拥有实体实例不再引用具有 cascade="all-delete-orphan" 的集合:Persistence.Product.ModelMap
- 集合被 flush() 处理了两次
- 找到对集合的共享引用:Persistence.Product.ModelMap
当我检索产品时。仅当我有两个或更多请求同时访问服务器时才会发生这种情况。我每个请求使用一个会话。

属性 ModelMap 在 Products 映射定义中的 Hibernate XML 中定义如下:

<bag name="ModelMap" table="MapProductModel" cascade="all-delete-orphan" lazy="true" inverse="true" where="IsDeleted=0">
  <key column="fkProductId" />
  <one-to-many class="MapProductModel" />
</bag>

这发生在下面的代码行

IList<T> itemList = criteria.List<T>();

检索产品时。

非常感谢任何帮助,Google 并没有真正提供任何帮助。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    ASP.NET 是多线程的,因此请求将在同一个 HTTP 请求中的多个线程中进入。您应该使用 NHibernate 的网络会话上下文(或其他方式);为每个 HTTP 请求创建一个新会话是不够的。见http://nhibernate.info/doc/nhibernate-reference/architecture.html#architecture-current-session

    【讨论】:

      【解决方案2】:

      criteria.List 触发会话刷新,这会导致 NH 遍历所有对象并确定需要将哪些命令发送到数据库。任何其他会话刷新都可能会触发相同的异常。

      您使用 ModelMap 的方式导致刷新周期中断。当我遇到这些错误时,我通常会通过注释掉我一一引用该集合的地方来缩小范围。一旦你知道有问题的线路修复它应该很容易(希望如此)

      【讨论】:

      • 我已经通过在 ISession 对象周围使用锁定来临时修复它。问题是,会话是由会话工厂基于每个请求创建的,所以我觉得很奇怪,当每个线程的会话应该是唯一的时,它看起来像是一个线程问题。
      猜你喜欢
      • 2012-08-12
      • 2010-12-14
      • 2011-08-07
      • 2012-10-14
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多