我有一个模型,其中 aPerson
有一个延迟加载的 s 集合Registration
。我的 NHibernate 3.3.3 查询JoinQueryOver
在该关系中使用以及更多:
var reg = Session.QueryOver<Person>()
.Where(p => p.ID == pid)
.JoinQueryOver<Registration>(p => p.Registrations)
.Where(r => r.IsDropped == false)
.JoinQueryOver<Slot>(r => r.Slot)
.JoinQueryOver<Position>(s => s.Position)
.JoinQueryOver<AcademicTerm>(p => p.Term)
.Where(t => t.ID == currentTerm.ID)
.SingleOrDefault();
在日志中,我看到了查询的预期 SQL,并且得到了预期的Person
实例,但是当我访问 Registrations 集合时,会(延迟)加载完整的注册集合。我期待它只是符合标准的注册的部分集合。
在上一个问题Fetch()
中,我遇到了相反的问题,并通过在查询中添加子句来修复它。
JoinQueryOver 条件什么时候会导致根实体有部分集合,什么时候它有一个将被延迟加载的未加载集合?我觉得我应该明白这一点。
我的流利映射Person
:
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Id(x => x.ID).GeneratedBy.Guid();
Map(x => x.Username).Length(20).Unique();
Map(x => x.HashedPassword).Length(Security.HashedPasswordEncodedLength);
Map(x => x.PasswordSalt).Length(Security.PasswordSaltEncodedLength);
Map(x => x.LastName).Length(25).Index("FullName");
Map(x => x.FirstName).Length(20).Index("FullName");
Map(x => x.StudentID).Length(12).Nullable();
Map(x => x.EmployeeID).Length(12).Nullable();
Map(x => x.EmailAddress).Length(72);
Map(x => x.IsAdmin).Nullable();
Map(x => x.IsAgencyStaff).Nullable();
Map(x => x.IsCenterStaff).Nullable();
Map(x => x.IsFaculty).Nullable();
Map(x => x.IsRegistrant).Nullable();
Map(x => x.IsStudent).Nullable();
Map(x => x.Type);
Map(x => x.AuthenticationMode);
HasMany<Registration>(x => x.Registrations).KeyColumn("Registrant_id")
.LazyLoad()
.AsBag()
.Inverse()
.Access.CamelCaseField(Prefix.Underscore)
.Cascade.SaveUpdate();
}
}
更新
将此与我的另一个问题(上面链接)进行比较,我遇到了相反的问题,即使用 aLeft.JoinQueryOver
从基础实体获取集合。我在这里尝试过,然后得到了预期的部分集合。(在另一种情况下,我实际上不需要左连接;我不记得它为什么在那里。)
获取的记录在有或没有左连接的情况下是相同的,但 NHibernate 在一种情况下填充集合,而不是在另一种情况下。我怀疑这是我可以依赖的行为,所以我改变了我的策略,分别查询注册。