我知道延迟加载' 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();
}
}
}
答案 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)
以将学生和评论同时放在同一个查询中,但我通常不建议这样做。