【发布时间】:2011-07-11 12:03:21
【问题描述】:
我的对象模型有点复杂,形成了一个三角形。有一个 User 实体集合了 Items 和 Taxonomies。 Item 也有分类。为了方便起见,我想让Item 和Taxonomy 知道它的所有者,Taxonomy 知道它的Item,如果有的话。见图表:
所以这产生了三个双向关系。我的问题是当我像这样在 NHibernate 中映射它并要求具有给定 ID 的用户时,我遇到了Select N+1 问题。
首先,User 加载了急切获取的Items。然后Taxonomies 加载了急切获取的Item 连接到它。这是预期的并且在映射中定义。但是现在有 N+1 个查询要加载与Taxonomies 相关的Items。
这是多余的,因为对象图的所有部分都已加载。当我从User 一侧使我的User-Item 关系单向时,这个问题就消失了(正如预期的那样,只有2 个查询),但我不想删除这种反向关系。 是否可以对所有三种关系进行双向优化获取?
这是我的映射部分:
public class UserOverride : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
mapping.HasMany(x => x.Items).Inverse()
.Not.LazyLoad().Fetch.Join();
mapping.HasMany(x => x.Taxonomies).Inverse()
.LazyLoad().Fetch.Select();
}
}
public class ItemOverride : IAutoMappingOverride<Item>
{
public void Override(AutoMapping<Item> mapping)
{
mapping.References(x => x.Taxonomy); // many-to-one
}
}
public class TaxonomyOverride : IAutoMappingOverride<Taxonomy>
{
public void Override(AutoMapping<Taxonomy> mapping)
{
mapping.HasOne(x => x.Item).PropertyRef(x => x.Taxonomy)
.Not.LazyLoad().Fetch.Join();
}
}
我以最简单的方式查询我的数据库:
var user = session.Get<User>(1);
【问题讨论】:
标签: nhibernate fluent-nhibernate bidirectional-relation