首页 > 解决方案 > 子对象上 CreateCriteria 时的延迟初始化异常

问题描述

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

医生.hbm.xml:

<bag name="Appointments" table="AppointmentDoctor" lazy="true">
  <key>
    <column name="DoctorId"/>
  </key>
  <many-to-many class="Appointment">
    <column name="AppointmentId"/>
  </many-to-many>
</bag>

当我做这个请求时,它工作正常:

            var criteria = session.CreateCriteria(typeof(Doctor));
            criteria.SetFetchMode("Appointments", FetchMode.Join);

添加 SetFetchMode 的事实正确返回 Appoinment。

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

            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));

Appointment 上的获取不再完成,稍后我得到一个延迟初始化异常。

知道为什么会这样吗?

标签: hibernatenhibernate

解决方案


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

//Collection criteria must be left joined to be fetched
var appointmentsCriteria = criteria.CreateCriteria("Appointments", JoinType.LeftJoin);
            

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

var appointmentsCriteria = criteria.CreateCriteria("Appointments")
                               .Fetch(SelectMode.Fetch, string.Empty);

更多关于SelectMode可以在这里找到


推荐阅读