为什么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)
Access=none
属性指的是POCO中集合的访问级别;在你的查询中没有。(访问权限可以是"属性"、"字段"、"公共字段"等)。因此,它与如何处理您的集合无关。
请看这里和这里
使用lazy=true
将阻止您的集合加载,直到您引用它(据我所知,这是您想要的)。
我怀疑这是一个hack,但是如果我将LazyLoad()添加到映射中,它可以防止第二个不需要的查询运行:
HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").LazyLoad().Access.None();