首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在子对象上执行CreateCriteria时出现延迟初始化异常

在子对象上执行CreateCriteria时出现延迟初始化异常
EN

Stack Overflow用户
提问于 2020-12-23 16:25:55
回答 1查看 60关注 0票数 0

我真的不明白这种情况,我有两个对象Doctor和Appointment,这两个表由一个Id映射表链接:

Doctor.hbm.xml:

代码语言:javascript
运行
复制
<bag name="Appointments" table="AppointmentDoctor" lazy="true">
  <key>
    <column name="DoctorId"/>
  </key>
  <many-to-many class="Appointment">
    <column name="AppointmentId"/>
  </many-to-many>
</bag>

当我执行这个请求时,它工作得很好:

代码语言:javascript
运行
复制
            var criteria = session.CreateCriteria(typeof(Doctor));
            criteria.SetFetchMode("Appointments", FetchMode.Join);

添加SetFetchMode的事实正确地返回了约会。

但是一旦我创建了一个像这样的子查询:

代码语言:javascript
运行
复制
            var criteria = session.CreateCriteria(typeof(Doctor));
            criteria.SetFetchMode("Appointments", FetchMode.Join);
            
            //New sub query
            var appointmentsCriteria = criteria.CreateCriteria("Appointments");
            appointmentsCriteria.Add(Restrictions.Eq("AppointmentState", AppointmentState.Cancelled));

约会时的fetch不再完成,稍后我会得到一个延迟初始化异常。

知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-25 00:39:34

criteria.CreateCriteria("Appointments")将覆盖您使用criteria.SetFetchMode("Appointments", FetchMode.Join);请求的行为。默认情况下,不获取内部联接的集合条件。所以你必须使用左连接:

代码语言:javascript
运行
复制
//Collection criteria must be left joined to be fetched
var appointmentsCriteria = criteria.CreateCriteria("Appointments", JoinType.LeftJoin);

或者,如果您使用的是NHibernate 5.2+,则可以使用SelectMode.Fetch来获取内部联接的集合:

代码语言:javascript
运行
复制
var appointmentsCriteria = criteria.CreateCriteria("Appointments")
                               .Fetch(SelectMode.Fetch, string.Empty);

有关SelectMode的更多信息,请访问here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65421128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档