NHibernate - 找到对集合的共享引用

时间:2011-03-03 11:19:19

标签: nhibernate

在我的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>();

检索产品时。

任何帮助都非常感谢,谷歌并没有真正提出任何建议。

2 个答案:

答案 0 :(得分:1)

criteria.List触发会话刷新,这会导致NH遍历所有对象并找出需要发送到db的命令。任何其他会话刷新可能会触发相同的异常。

关于你使用ModelMap的方式导致刷新周期中断。当我遇到这些错误时,我通常会通过评论我逐一引用该集合的地方来缩小它。一旦你知道违规行修理它应该很容易(希望如此)

答案 1 :(得分:1)

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