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

时间:2011-08-25 23:52:50

标签: c# nhibernate many-to-many noop

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

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

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

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

我运行了两个查询 - 第一个是执行get by id的查询,第二个是获取Projects列表的查询。

我认为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)。

2 个答案:

答案 0 :(得分:1)

Access=none属性是指POCO中集合的访问级别;不在您的查询中。 (访问可以是'属性','字段','公共字段'等)。所以它与你的收藏品处理方式无关 见herehere
使用lazy=true会阻止您的收藏被加载,直到您引用它为止(根据我的理解,这是您想要的)。

答案 1 :(得分:0)

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

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