我无法在NHibernate中关闭延迟加载
我知道惰性加载“on”是NHibernate中的默认设置。我使用代码映射关闭了实体(学生)和实体中包含的集合(注释)的延迟加载。但是,包括使用SQL Profiler的测试表明,当通过Session.Get()访问实体时,它不会从数据库加载集合。我只看到一个“Select”从数据库中获取实体(Student)。没有“加入”或“选择”到集合表(注释)。我错过什么了吗?我使用的是NH版本5 映射:我无法在NHibernate中关闭延迟加载,nhibernate,lazy-loading,mapping-by-code,Nhibernate,Lazy Loading,Mapping By Code,我知道惰性加载“on”是NHibernate中的默认设置。我使用代码映射关闭了实体(学生)和实体中包含的集合(注释)的延迟加载。但是,包括使用SQL Profiler的测试表明,当通过Session.Get()访问实体时,它不会从数据库加载集合。我只看到一个“Select”从数据库中获取实体(Student)。没有“加入”或“选择”到集合表(注释)。我错过什么了吗?我使用的是NH版本5 映射: using NHibernate.Mapping.ByCode.Conformist; using N
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());
}
}
}
使用NHibernate.Mapping.ByCode.Conformist;
使用NHibernate.Mapping.ByCode;
命名空间Infrastructure.Repository.NH.Tests
{
公共类StudentSubclass映射:JoinedSubclass映射
{
公共学生子类映射()
{
懒惰(假);
属性(student=>student.EnrolmentDate);
列表(学生=>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; }
}
公共班级学生:联系
{
公共虚拟日期时间?注册日期{get;set;}
公共虚拟IList注释{get;set;}
}
测试:
public void Get_testtocheckiflazyloading isturnedoff()
{
使用(var session=SessionFactory.OpenSession())
{
使用(var transaction=session.BeginTransaction())
{
var student=session.Get(2);
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发出第一个查询(通过联系人/学生),而不会发出注释查询,因为学生不存在
如果您有一个ID为2
的学生,您应该在初始查询之后看到对Comments表的查询
如果愿意,您可以尝试添加
listMapper.Fetch(CollectionFetchMode.Join)
将学生和注释带到同一个查询中,尽管我通常不建议这样做。是的,就是这样,我在数据库中没有实体。如果不是这样的话,效果会非常好。
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)]