1

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

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 属性为 null - 因此没有设置该属性(使第二个查询更加冗余!)

我正在使用 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)。

4

2 回答 2

1

Access=none属性是指您的 POCO 中集合的访问级别;不在您的查询中。(访问可以是“属性”、“字段”、“公共字段”等)。因此它与您的收藏的处理方式无关。
see herehere
usinglazy=true会阻止您的集合被加载,直到您引用它(据我了解,这就是您想要的)。

于 2011-08-26T11:45:57.760 回答
0

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

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").LazyLoad().Access.None();
于 2011-08-26T02:21:05.437 回答