我想缓存一个永远不会改变的聚合,它只能由根对象访问(所有其他实体只能通过使用根对象上的 Reference/HasMany 属性来访问)?
我应该使用 NHibernate(我们已经在使用)二级缓存还是构建某种提供对聚合中所有实体的访问的单例更好?
我发现了一篇关于获取所有内容的博客文章,MultiQuery
但我的数据库不支持它。
这样做的“旧方法”是
- 从所有聚合表中选择 *
- 循环实体并手动设置引用和集合
就像是:
foreach (var e in Entities)
{
e.Parent = loadedParentEntities.SingleOrDefault(pe => e.ParentId = pe.Id);
}
但肯定有办法告诉 NHibernate 为我做这件事吗?
更新
目前,我尝试仅从数据库中获取所有内容,并希望 NHibernate 完成所有参考设置。然而它没有:(
var getRoot = Session.Query<RootObject>().ToList();
var getRoot_hasMany = Session.Query<RootObjectCollection>().ToList();
var getRoot_hasMany_ref = Session.Query<RootObjectCollectionReference>().ToList();
var getRoot_hasMany_hasMany = Session.Query<RootObjectCollectionCollection>().ToList();
领域:
根对象是getRoot
. 这些有一个集合属性“HasMany”。这些 HasMany 每个都有一个返回 GetRoot 的引用,一个对另一个实体的引用 (getRoot_hasMany_ref),以及它们自己的一个集合 (getRoot_hasMany_hasMany)。如果这没有意义,我将创建一个 ERD,但实际结构与问题并不真正相关(我认为)。
这导致执行 4 个查询。(这很好)
但是,当访问类似的属性时getRoot.First().HasMany.First().Ref
,getRoot.First().HasMany.First().HasMany().First()
它仍然会导致执行额外的查询,即使所有内容都应该已经被ISession
?
那么我如何告诉 NHibernate 执行这 4 个查询,然后在不使用任何代理属性的情况下构建图形,......这样即使在ISession
超出范围后我也可以访问所有内容?