我真的不明白这种情况,我有两个对象Doctor和Appointment,这两个表由一个Id映射表链接:
Doctor.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的事实正确地返回了约会。
但是一旦我创建了一个像这样的子查询:
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不再完成,稍后我会得到一个延迟初始化异常。
知道为什么会这样吗?
发布于 2020-12-25 00:39:34
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的更多信息,请访问here
https://stackoverflow.com/questions/65421128
复制相似问题