为什么NHIbernate (Fluent)仍然执行查询我的Noop属性

本文关键字:查询 执行 我的 Noop 属性 NHIbernate Fluent 为什么 | 更新日期: 2023-09-27 18:06:45

我有一个与项目有多对多关系的用户对象。在我的用户映射中,我有:

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").Access.None();

当我运行简单的get by id查询:

session.QueryOver<User>()
       .Where(x => x.PrimaryID == id)
       .Take(1).SingleOrDefault();

我得到两个正在运行的查询-第一个是查询按id获取,第二个是查询获取项目列表。

我认为noop属性的目的是让NHibernate可以意识到一个关系,但实际上不是填充属性…?有趣的是,Projects属性在查询之后为空-因此没有设置该属性(使第二个查询更加冗余!)

我正在使用NHibernate v3.1.0.4000和FluentNHibernate v1.2.0.712

编辑

我已经做了一些测试,并确定这不是使用流畅查询接口特有的问题。此外,当我将映射转储到hbm文件时,该属性的映射如下:

<set access="none" name="Projects" table="UsersProjects">
  <key>
    <column name="UserID" />
  </key>
  <many-to-many class="Project">
    <column name="ProjectID" />
  </many-to-many>
</set>

这看起来像我所期望的(http://ayende.com/blog/4054/nhibernate-query-only-properties)

为什么NHIbernate (Fluent)仍然执行查询我的Noop属性

Access=none属性指的是POCO中集合的访问级别;在你的查询中没有。(访问权限可以是"属性"、"字段"、"公共字段"等)。因此,它与如何处理您的集合无关。
请看这里和这里
使用lazy=true将阻止您的集合加载,直到您引用它(据我所知,这是您想要的)。

我怀疑这是一个hack,但是如果我将LazyLoad()添加到映射中,它可以防止第二个不需要的查询运行:

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").LazyLoad().Access.None();