nHibernate 多对多映射和延迟加载

标签 nhibernate session nhibernate-mapping many-to-many lazy-loading

我的 Web 应用程序中的 nHibernate 中的多对多关联和 session 存在问题。

我正在使用的对象始终保持与 session 的连接,尽管往返于服务器。从来没有问题。到现在。我在类(class)中添加了一个新的多对多关联。

这是多对多映射(名称更改为更有意义):

 <bag name="ProductsToCategory" table="Tab_ProductsToCategory"" cascade="all-delete-orphan">
      <key column="ProductID" />
      <many-to-many class="CategoryClass" column="CategoryID" />
 </bag>

当我运行代码时,它会在初始加载时运行。然而,随后对访问此对象的服务器的调用 - 该对象在 Web session 中维护 - 导致此集合被破坏并抛出此错误:

failed to lazily initialize a collection, no session or session was closed

奇怪。我想知道是否存在导致问题的多对多关联?这种多对多仅添加到此类,而不添加到映射另一端的类“CategoryClass”,因为我在那里不需要它。 在我添加此映射之前,对象似乎没问题。

有什么想法吗?

另外:我尝试简单地检查对象是否不再在 session 中。不是。所以我调用:session.refresh(productClass) 并且所有内容都得到正确更新,包括我的麻烦映射。然而。它两次加载集合中的每个项目!该集合的项目数量是数据库中项目的两倍,每个项目出现两次。如果我能得到这个问题的答案,那么前面的问题就没有那么重要了。

如果您需要任何其他信息,请告诉我。干杯。

最佳答案

我假设您在 Web 应用程序中使用每次请求 session 模式。延迟加载要求最初用于加载父对象的 session 在访问其子集合时仍然打开。您在每个 HTTP 请求上创建一个新 session ,因此在第一个请求中存储在 session 状态中的对象在第二个请求中是分离的对象。这就是您收到错误以及原始对象不在第二个请求 session 中的原因。

要修复它,请在从 session 状态访问对象时调用 ISession.Lock

var myProductClass = GetProductClassFromSession(); // whatever method you use to do this
session.Lock(myProductClass, LockMode.None);

这应该可以解决您的问题,但更好的方法可能是使用 NHibernate 的二级缓存功能而不是 session 状态。

顺便说一下,您可能不希望在多对多映射中使用 cascade="all-delete-orphan"。这将导致在删除产品时删除类别对象。

关于nHibernate 多对多映射和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6291651/

相关文章:

wordpress - 如何更改 WordPress 中的 session 过期时间?

java - 按 id 加载实体时 Hibernate enableFilter 不起作用

hibernate - 我可以在 NHibernate 中查询派生字段吗?

.net - FluentNhibernate,从多个程序集添加映射

nhibernate - 使用 Fluent NHibernate 定义派生 bool 属性

n :n relatinship 中的 NHibernate 映射

wcf - NHibernate 类作为数据契约

nhibernate - Fluent NHibernate 和 .NET 4 的奇怪覆盖问题

java - 程序运行时的 Dropwizard session

php - session 数据在本地测试服务器上工作,但一旦上传到互联网就不起作用