NHibernate的4升级 - 不能同时取出多​​个袋 [英] NHibernate 4 upgrade - Cannot simultaneously fetch multiple bags

查看:182
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆