【发布时间】:2013-11-14 01:03:16
【问题描述】:
我有一个模型,其中 Person 具有 Registrations 的延迟加载集合。我的 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 集合时,会(延迟)加载完整的注册集合。我原以为它只是符合条件的注册的部分集合。
在a previous question 中,我遇到了相反的问题,并通过在查询中添加Fetch() 子句来解决它。
JoinQueryOver 条件何时会导致根实体具有部分集合,以及何时会具有将延迟加载的未加载集合?我觉得我应该明白这一点。
我对@987654328@的流畅映射:
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();
}
}
更新
将此与我的另一个问题(上面链接)进行比较,我遇到了相反的问题,即使用Left.JoinQueryOver 从基本实体获取集合。我在这里尝试过,然后得到了预期的部分集合。 (在另一种情况下,我实际上不需要左连接;我不记得它为什么在那里。)
无论有没有左连接,获取的记录都是相同的,但是 NHibernate 在一种情况下填充集合,而不是在另一种情况下。我怀疑这是我可以依赖的行为,所以我改变了我的策略,分别查询注册。
【问题讨论】:
标签: nhibernate fluent-nhibernate queryover