IMAGINA我有相当复杂的模型图,例如用于一个例子:
Orchestra -> Musicians -> Instruments -> Properties
-> Items
-> Songs -> Parts
我知道理论上期货是如何工作的,但我怎么加载这个完整的图表可以说,对于一个具体的音乐家(由id指定)。
我知道,在同级别每个收集我要创建一个简单的查询未来,以避免在同一查询笛卡尔乘积。 所以,当我执行这样的代码:
using(var session = GetSession()){
var instrumentQuery = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instruments>(x=>x.Instruments)
.Future();
var instrumentProperties = = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instrument>(x=>x.Instruments, ()=> instrumentAlias)
.JoinQueryOver<Property>(()=>instrumentAlias.Properties)
.Future();
var instrumentItems = = session.QueryOver<Musicians>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.JoinQueryOver<Instrument>(x=>x.Instruments, ()=> instrumentAlias)
.JoinQueryOver<Item>(()=>instrumentAlias.Items)
.Future();
...
...CONTINUE same future queries for each unique collection
...
...
var result = session.QueryOver<Musician>()
.Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
.SingleOrDefault<Musician>(); //This query is not future so it should???? load all futures ???
return result;
}
但是,即使最后的查询是不是未来它不会把那些FUTUR..ISH查询数据库(我检查与SQL事件探查器...有没有这样的SQL前往DB)
musician.instrument仍然抛出延迟初始化例外。
此代码是唯一demostrative和纯理论性的。
我想避免的是:
- 使用HQL(我讨厌那些神奇的字符串...)
- 更改映射,因为有使用情况下,我只需要音乐家和intrument加载热切的一切吗? (或任何其它子集)
- 避免这里N + 1次的查询问题
- 离开会议开得太久,因为这些数据可以从其他服务器实例更改
我想实现
- 或者强制的nhibernate到correstly创建和提供标准构造对象结构。
要么
- 强制NHibernate的使用获取选择该查询只
还有simmilar问题: 如何加载使用NHibernate一个庞大,复杂的对象图
答案是...更改映射......我不想因为我没有看到一个点,加载每次使用投(甚至是简单的)这种复杂的图形
技术背景:
- 我们使用NHibernate的4.0
- 作为DB可能Azure的数据库或SQL Server将使用(或可能PostgreSQL系统)。