2017-12-13 61 views
1

NHibernateのデフォルト設定は遅延ロード 'on'です。エンティティ(Student)とエンティティ内に含まれるコレクション(Comments)に対して、コードごとのマッピングを使用して遅延ロードをオフに切り替えました。しかし、SQL-Profilerの使用を含むテストでは、エンティティがSession.Get()を介してアクセスされたときにデータベースからコレクションをロードしないことが示されています。 Dbから実体(生徒)を取得するための「選択」のみが表示されます。コレクションテーブル(コメント)に「結合」または「選択」しません。何か不足していますか?テストNHibernateでレイジーローディングをオフにすることはできません

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

ちょうどNHibernateは5.0.3でこれをテストし、それはそうドメイン

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()); 
     } 
    } 
} 

:私は、NHバージョン5.

マッピングを使用しています正しく動作するように:

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 [email protected];@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 [email protected];@p0 = 1 [Type: Int32 (0:0:0)] 

あなたが既に持っているlistMapper.Lazy(CollectionLazy.NoLazy)はこのトリックを行うべきです。

私はおそらくあなたはID番号2の学生をデータベースに持っていないと思いますか? その場合、NHibernateが(Contact/Student経由で)最初のクエリを発行するだけで、Studentが存在しないのでComments経由でクエリを発行することはありません。

学生IDが2の場合は、最初のコメントの直後にコメント表が表示されます。

好きな場合は、listMapper.Fetch(CollectionFetchMode.Join)を追加して、学生とコメントの両方を同じクエリに表示することができますが、これは一般的に推奨しません。

+0

はい、それは、データベースにエンティティがありません。完全に別の方法で動作します。 – Len

関連する問題