【发布时间】:2013-08-03 22:38:08
【问题描述】:
我想缓存一个只能由根对象访问的永不更改的聚合(所有其他实体只能通过使用根对象上的 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 超出范围后我也可以访问所有内容?
【问题讨论】:
标签: c# nhibernate caching second-level-cache