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

时间:2017-12-13 07:25:05

标签: nhibernate lazy-loading mapping-by-code

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

1 个答案:

答案 0 :(得分:1)

刚刚使用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),并且由于学生不存在,它不会发出对评论的查询。

如果您的学生身份证明2,您应该在最初的学生之后看到对“评论”表的查询。

如果您愿意,可以尝试添加listMapper.Fetch(CollectionFetchMode.Join)以将学生和评论同时放在同一个查询中,但我通常不建议这样做。