载入中NHibernate的复杂的图形(Loading complex graph in nhibe

2019-10-22 02:57发布

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系统)。

Answer 1:

我要说,这里的方法是

  • 使用Fetch代替JoinQuery
  • 最终结果Future以及

因此,这将是更新的摘要:

var instrumentQuery = session.QueryOver<Musicians>()
     .Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
     .Fetch(x=>x.Instruments).Eager
     .Future();
var instrumentProperties = = session.QueryOver<Musicians>()
     .Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
     .Fetch(x=>x.SecondCollection).Eager
     .Future();

...
...CONTINUE same future queries for each unique collection       
...

...
var result = session.QueryOver<Musician>()
     .Where(x=>x.Id == CONCRETEMUSICIANIDTHERE)
     // all will be fetaures
     .Future()
     .SingleOrDefault<Musician>();

注:我会去不同的方式。 负载只是根对象(音乐家)。 使用批量大小优化抓取。 创建DTO而会议是开放的。



文章来源: Loading complex graph in nhibernate