小编Nat*_*ari的帖子

NHibernate 3.x在组合LINQ分页,多对多和子选择提取时删除子实体

我们的应用程序具有故事的概念和标签的概念.故事可以应用许多标签,标签可以应用于许多故事,使关系多对多.这两个表,故事标签与第三个StoriesToTags桥接.

映射文件的相关部分如下:

这是从StoryTag的映射:

<class name="Story" table="Stories">
  ...
  <set fetch="subselect" name="Tags" table="StoriesToTags">
    <key>
      <column name="StoryId" />
    </key>
    <many-to-many class="Tag">
      <column name="TagId" />
    </many-to-many>
  </set>
</class>
Run Code Online (Sandbox Code Playgroud)

以及从TagStory的反向关系:

<class name="Tag" table="Tags">
  ...
  <set fetch="subselect" inverse="true" name="Stories" table="StoriesToTags">
    <key>
      <column name="TagId" />
    </key>
    <many-to-many class="Story">
      <column name="StoryId" />
    </many-to-many>
  </set>
</class>
Run Code Online (Sandbox Code Playgroud)

如您所见,我们使用子选择提取策略来避免N + 1查询问题.一切都很好,直到您尝试使用LINQ分页结果:

IQueryable<Story> stories = GetStories(...).TakePage(pageNumber, pageSize);
Run Code Online (Sandbox Code Playgroud)

运行此查询后,NHibernate将删除未在查询中加载的所有故事的关系(StoriesToTags中的记录).它似乎只在标记被特定加载时发生(即,触发子选择).如果我们切换到连接或 …

linq nhibernate linq-to-nhibernate

9
推荐指数
1
解决办法
342
查看次数

标签 统计

linq ×1

linq-to-nhibernate ×1

nhibernate ×1