我无法关闭 NHibernate 中的延迟加载
I cannot turn off lazy loading in NHibernate
我知道延迟加载 'on' 是 NHibernate 中的默认设置。我使用代码映射为实体 (Student) 和实体中包含的集合 (Comments) 关闭了延迟加载。但是,包括使用 SQL-Profiler 的测试表明,当通过 Session.Get() 访问实体时,它不会从数据库加载集合。我只看到 'Select' 从数据库中获取实体(学生)。没有 'Join' 或 'Selects' 到集合 table(评论)。我错过了什么吗?我正在使用 NH 版本 5。
映射:
using NHibernate.Mapping.ByCode.Conformist;
using NHibernate.Mapping.ByCode;
namespace Infrastructure.Repository.NH.Tests
{
public class StudentSubclassMapping: JoinedSubclassMapping<Student>
{
public StudentSubclassMapping()
{
Lazy(false);
Property(student => student.EnrollmentDate);
List(student => student.Comments,
listMapper =>
{ listMapper.Lazy(CollectionLazy.NoLazy);},
relationMapper =>
relationMapper.Element());
}
}
}
域:
public class Student : Contact
{
public virtual DateTime? EnrollmentDate { get; set; }
public virtual IList<string> Comments { get; set; }
}
测试:
public void Get_TestToCheckIfLazyLoadingIsTurnedOff()
{
using (var session = SessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var student = session.Get<Student>(2);
transaction.Commit();
}
}
}
刚刚使用 NHibernate 5.0.3 对此进行了测试,它似乎工作正常:
NHibernate: SELECT student0_.student_key as id1_0_0_, student0_.EnrollmentDate as enrollmentdate2_1_0_ FROM Student student0_ inner join Contact student0_1_ on student0_.student_key=student0_1_.Id WHERE student0_.student_key=@p0;@p0 = 1 [Type: Int32 (0:0:0)]
NHibernate: SELECT comments0_.student_key as student1_2_0_, comments0_.id as id2_2_0_, comments0_.idx as idx3_0_ FROM Comments comments0_ WHERE comments0_.student_key=@p0;@p0 = 1 [Type: Int32 (0:0:0)]
您已经拥有的 listMapper.Lazy(CollectionLazy.NoLazy)
应该可以解决问题。
我想也许您的数据库中确实没有 ID 为 2
的学生?
如果是这种情况,您将只会看到 NHibernate 发出第一个查询(超过 Contact/Student),并且不会发出对 Comments 的查询,因为学生不存在。
如果您有 ID 为 2
的学生,您应该会在第一条评论后立即看到对评论 table 的查询。
如果您愿意,可以尝试添加 listMapper.Fetch(CollectionFetchMode.Join)
以在同一个查询中同时包含学生和评论,尽管我通常不推荐这样做。
我知道延迟加载 'on' 是 NHibernate 中的默认设置。我使用代码映射为实体 (Student) 和实体中包含的集合 (Comments) 关闭了延迟加载。但是,包括使用 SQL-Profiler 的测试表明,当通过 Session.Get() 访问实体时,它不会从数据库加载集合。我只看到 'Select' 从数据库中获取实体(学生)。没有 'Join' 或 'Selects' 到集合 table(评论)。我错过了什么吗?我正在使用 NH 版本 5。
映射:
using NHibernate.Mapping.ByCode.Conformist;
using NHibernate.Mapping.ByCode;
namespace Infrastructure.Repository.NH.Tests
{
public class StudentSubclassMapping: JoinedSubclassMapping<Student>
{
public StudentSubclassMapping()
{
Lazy(false);
Property(student => student.EnrollmentDate);
List(student => student.Comments,
listMapper =>
{ listMapper.Lazy(CollectionLazy.NoLazy);},
relationMapper =>
relationMapper.Element());
}
}
}
域:
public class Student : Contact
{
public virtual DateTime? EnrollmentDate { get; set; }
public virtual IList<string> Comments { get; set; }
}
测试:
public void Get_TestToCheckIfLazyLoadingIsTurnedOff()
{
using (var session = SessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var student = session.Get<Student>(2);
transaction.Commit();
}
}
}
刚刚使用 NHibernate 5.0.3 对此进行了测试,它似乎工作正常:
NHibernate: SELECT student0_.student_key as id1_0_0_, student0_.EnrollmentDate as enrollmentdate2_1_0_ FROM Student student0_ inner join Contact student0_1_ on student0_.student_key=student0_1_.Id WHERE student0_.student_key=@p0;@p0 = 1 [Type: Int32 (0:0:0)]
NHibernate: SELECT comments0_.student_key as student1_2_0_, comments0_.id as id2_2_0_, comments0_.idx as idx3_0_ FROM Comments comments0_ WHERE comments0_.student_key=@p0;@p0 = 1 [Type: Int32 (0:0:0)]
您已经拥有的 listMapper.Lazy(CollectionLazy.NoLazy)
应该可以解决问题。
我想也许您的数据库中确实没有 ID 为 2
的学生?
如果是这种情况,您将只会看到 NHibernate 发出第一个查询(超过 Contact/Student),并且不会发出对 Comments 的查询,因为学生不存在。
如果您有 ID 为 2
的学生,您应该会在第一条评论后立即看到对评论 table 的查询。
如果您愿意,可以尝试添加 listMapper.Fetch(CollectionFetchMode.Join)
以在同一个查询中同时包含学生和评论,尽管我通常不推荐这样做。