NHibernate的4升级 - 不能同时取出多个袋 [英] NHibernate 4 upgrade - Cannot simultaneously fetch multiple bags
本文介绍了NHibernate的4升级 - 不能同时取出多个袋的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想NH 3.3.1.4000升级到最新版本,NH 4.0.2.4000,我有一个问题,支持fetchmany和ThenFetchMany。
在本文中,我了解到,这个旧功能不再有效,<一个href="http://stackoverflow.com/questions/25450581/breaking-changes-with-nhibernate-4-upgrade">Breaking与NHibernate 4的变化升级。
什么是做这种获取的新的NH版本的正确方法是什么?
code例:
VAR IdsList =新名单{/ *有些IDS * /};
session.Query&LT; A&GT;()
.FetchMany(X =&GT; x.B_ObjectsList)
.ThanFetchMany(X =&GT; x.C_ObjectsList)
。凡(X =&GT; IdsList.Contains(X =&GT; x.Id))
.ToList();
类:
公共类
{
公众诠释编号{获取;集;}
公众的IList&LT; B&GT; B_ObjectsList {获取;集;}
}
公共B类
{
公众诠释编号{获取;集;}
公众的IList&LT; C&GT; C_ObjectsList {获取;集;}
}
公共C级
{
公众诠释编号{获取;集;}
}
映射:
&LT;类名=A表=A&GT;
&LT; ID名称=ID类型=INT列=ID未保存值=0&GT;
&LT;生成器类=身份/&GT;
&LT; / ID&GT;
&LT;包名=B表=B逆=假懒惰=真正的
级联=全删除,孤儿&GT;
&LT; /类&GT;
&LT;类名=B表=B&GT;
&LT; ID名称=ID类型=INT列=ID未保存值=0&GT;
&LT;生成器类=身份/&GT;
&LT; / ID&GT;
&LT;包名称=C表=C逆=假懒惰=真正的
级联=全删除,孤儿&GT;
&LT; /类&GT;
&LT;类名=C表=C&GT;
&LT; ID名称=ID类型=INT列=ID未保存值=0&GT;
&LT;生成器类=身份/&GT;
&LT; / ID&GT;
&LT; /类&GT;
解决方案
也许
VAR IdsList =新名单{/ *有些IDS * /};
VAR的结果= session.Query&LT; A&GT;()
.FetchMany(X =&GT; x.B_ObjectsList)
。凡(X =&GT; IdsList.Contains(x.Id))
.ToList();
//初始化C_ObjectsList
VAR出价= results.SelectMany(X =&GT; x.B_ObjectsList)。选择(B =&GT; b.Id)。.Distinct()了ToList();
session.Query&LT; B&GT;()
.FetchMany(X =&GT; x.C_ObjectsList)
。凡(B =&GT; 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;
这篇关于NHibernate的4升级 - 不能同时取出多个袋的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文