我无法在NHibernate中关闭延迟加载

我无法在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

我知道惰性加载“on”是NHibernate中的默认设置。我使用代码映射关闭了实体(学生)和实体中包含的集合(注释)的延迟加载。但是,包括使用SQL Profiler的测试表明,当通过Session.Get()访问实体时,它不会从数据库加载集合。我只看到一个“Select”从数据库中获取实体(Student)。没有“加入”或“选择”到集合表(注释)。我错过什么了吗?我使用的是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());
        }
    }
}
使用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)]