三角形を形成する少し複雑なオブジェクト モデルがあります。とUser
のコレクションを持つエンティティがあります。タクソノミーもあります。そして便宜上、私はその所有者を知りたいと思っていました。図を参照してください:Items
Taxonomies
Item
Item
Taxonomy
Taxonomy
Item
したがって、これにより 3 つの双方向関係が作成されます。私の問題は、NHibernate でそのようにマップし、指定された ID を持つユーザーを要求すると、Select N+1問題が発生することです。
最初User
は熱心にフェッチされた がロードされますItems
。次に、それに接続さTaxonomies
れた熱心にフェッチされてロードされますItem
。これは予想どおりであり、マッピングで定義されています。しかし、現在、 にItems
関連してロードする N+1 クエリがありますTaxonomies
。
オブジェクト グラフのすべての部分が既に読み込まれているため、これは冗長です。この問題は、User-Item
関係を横から一方向にすると消えUser
ますが (予想どおり、クエリは 2 つしかありません)、その後方関係を削除したくありません。双方向の 3 つのリレーションすべてで最適なフェッチを行うことは可能ですか?
ここに私のマッピング部分があります:
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);