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

NHibernate-找到对集合的共享引用,nhibernate,Nhibernate,在我的ASP.NET webforms应用程序中,我主要遇到上述异常,以及: -拥有实体实例:Persistence.Product.ModelMap不再引用cascade=“all delete orphan”的集合 -flush()处理了两次集合 -找到对集合的共享引用:Persistence.Product.ModelMap 当我检索产品时。只有当两个或多个请求同时命中服务器时,才会发生这种情况。我每个请求使用一个会话 属性ModelMap在产品映射定义的Hibernate XML中定义如

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

属性ModelMap在产品映射定义的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>();
IList itemList=criteria.List();
检索产品时


非常感谢任何帮助,Google并没有真正打开任何东西。

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


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

ASP.NET是多线程的,因此请求将在同一HTTP请求中的多个线程上进行。您应该使用NHibernate的web会话上下文(或其他方式);仅为每个HTTP请求创建一个新会话是不够的。请参见

我已通过在ISession对象周围使用锁临时修复了它。但问题是,会话是由会话工厂基于每个请求创建的,所以我觉得很奇怪,当会话应该是每个线程唯一的时候,它看起来像一个线程问题。