NHibernate的4升级 - 不能同时取出多​​个袋NHibernate

2023-09-03 17:36:22 作者:从此陌路

我想NH 3.3.1.4000升级到最新版本,NH 4.0.2.4000,我有一个问题,支持fetchmany和ThenFetchMany。

在本文中,我了解到,这个旧功能不再有效,Breaking与NHibernate 4的变化升级。

什么是做这种获取的新的NH版本的正确方法是什么?

code例:

  VAR IdsList =新名单{/ *有些IDS * /};
session.Query< A>()
.FetchMany(X => x.B_ObjectsList)
.ThanFetchMany(X => x.C_ObjectsList)
。凡(X => IdsList.Contains(X => x.Id))
.ToList();
 

类:

 公共类
{
    公众诠释编号{获取;集;}
    公众的IList< B> B_ObjectsList {获取;集;}
}

公共B类
{
    公众诠释编号{获取;集;}
    公众的IList< C> C_ObjectsList {获取;集;}
}

公共C级
{
    公众诠释编号{获取;集;}
}
 

映射:

 <类名=A表=A>
< ID名称=ID类型=INT列=ID未保存值=0>
  <生成器类=身份/>
< / ID>
<包名=B表=B逆=假懒惰=真正的
级联=全删除,孤儿>
< /类>

<类名=B表=B>
< ID名称=ID类型=INT列=ID未保存值=0>
  <生成器类=身份/>
< / ID>
<包名称=C表=C逆=假懒惰=真正的
级联=全删除,孤儿>
< /类>


<类名=C表=C>
< ID名称=ID类型=INT列=ID未保存值=0>
  <生成器类=身份/>
< / ID>
< /类>
 

解决方案

也许

  VAR IdsList =新名单{/ *有些IDS * /};
VAR的结果= session.Query< A>()
    .FetchMany(X => x.B_ObjectsList)
    。凡(X => IdsList.Contains(x.Id))
    .ToList();

//初始化C_ObjectsList
VAR出价= results.SelectMany(X => x.B_ObjectsList)。选择(B => b.Id)。.Distinct()了ToList();
session.Query< B>()
    .FetchMany(X => x.C_ObjectsList)
    。凡(B => bIds.Contains(b.Id))
    .ToList();

返回结果;
 

I tried to upgrade NH 3.3.1.4000 to the latest version NH 4.0.2.4000 and I had an issue with FetchMany and ThenFetchMany.

In this post I learned that this old functionality is no longer valid, Breaking changes with NHibernate 4 upgrade.

What is the correct way to do this kind of fetching on the new NH version?

Code Example:

var IdsList = new List { /* Some Ids */ };
session.Query<A>()
.FetchMany(x=>x.B_ObjectsList)
.ThanFetchMany(x=>x.C_ObjectsList)
.Where(x=>IdsList.Contains(x=>x.Id))
.ToList();

Classes:

Public Class A
{
    public int Id {get;set;}
    public IList<B> B_ObjectsList{get;set;}
}

Public Class B
{
    public int Id {get;set;}
    public IList<C> C_ObjectsList {get;set;}
}

Public Class C
{
    public int Id {get;set;}
}

Mapping:

<class name="A" table="A">
<id name="Id" type="int" column="Id" unsaved-value="0">
  <generator class="identity" />
</id>
<bag name="B" table="B" inverse="false" lazy="true"
cascade="all-delete-orphan">
</class>

<class name="B" table="B">
<id name="Id" type="int" column="Id" unsaved-value="0">
  <generator class="identity" />
</id>
<bag name="C" table="C" inverse="false" lazy="true"
cascade="all-delete-orphan">
</class>


<class name="C" table="C">
<id name="Id" type="int" column="Id" unsaved-value="0">
  <generator class="identity" />
</id>
</class>

解决方案

probably

var IdsList = new List { /* Some Ids */ };
var results = session.Query<A>()
    .FetchMany(x => x.B_ObjectsList)
    .Where(x=>IdsList.Contains(x.Id))
    .ToList();

// initialize C_ObjectsList
var bIds = results.SelectMany(x => x.B_ObjectsList).Select(b => b.Id).Distinct().ToList();
session.Query<B>()
    .FetchMany(x => x.C_ObjectsList)
    .Where(b => bIds.Contains(b.Id))
    .ToList();

return results;