Person
a に遅延ロードされた s のコレクションがあるモデルがありRegistration
ます。私の NHibernate 3.3.3 クエリはJoinQueryOver
、そのリレーションとそれ以上のものを使用します。
var reg = Session.QueryOver<Person>()
.Where(p => p.ID == pid)
.JoinQueryOver<Registration>(p => p.Registrations)
.Where(r => r.IsDropped == false)
.JoinQueryOver<Slot>(r => r.Slot)
.JoinQueryOver<Position>(s => s.Position)
.JoinQueryOver<AcademicTerm>(p => p.Term)
.Where(t => t.ID == currentTerm.ID)
.SingleOrDefault();
ログには、クエリの予想される SQL が表示され、予想されるPerson
インスタンスが取得されますが、Registrations コレクションにアクセスすると、登録の完全なコレクションが (遅延) 読み込まれます。基準を満たす登録の部分的なコレクションにすぎないと思っていました。
前の質問では、逆の問題がありFetch()
、クエリに句を追加して修正しました。
JoinQueryOver 条件によって、ルート エンティティが部分的なコレクションを持つようになるのはいつですか? これは理解しておかなければならない気がします。
私の流暢なマッピングPerson
:
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Id(x => x.ID).GeneratedBy.Guid();
Map(x => x.Username).Length(20).Unique();
Map(x => x.HashedPassword).Length(Security.HashedPasswordEncodedLength);
Map(x => x.PasswordSalt).Length(Security.PasswordSaltEncodedLength);
Map(x => x.LastName).Length(25).Index("FullName");
Map(x => x.FirstName).Length(20).Index("FullName");
Map(x => x.StudentID).Length(12).Nullable();
Map(x => x.EmployeeID).Length(12).Nullable();
Map(x => x.EmailAddress).Length(72);
Map(x => x.IsAdmin).Nullable();
Map(x => x.IsAgencyStaff).Nullable();
Map(x => x.IsCenterStaff).Nullable();
Map(x => x.IsFaculty).Nullable();
Map(x => x.IsRegistrant).Nullable();
Map(x => x.IsStudent).Nullable();
Map(x => x.Type);
Map(x => x.AuthenticationMode);
HasMany<Registration>(x => x.Registrations).KeyColumn("Registrant_id")
.LazyLoad()
.AsBag()
.Inverse()
.Access.CamelCaseField(Prefix.Underscore)
.Cascade.SaveUpdate();
}
}
更新
これを私の他の質問(上記のリンク)と比較すると、反対の問題がありLeft.JoinQueryOver
、ベースエンティティからコレクションに取得するために a を使用します。ここで試してみたところ、予想される部分コレクションが得られました。(他のケースでは左結合は実際には必要ありません。なぜそこにあるのか覚えていません。)
フェッチされるレコードは、左結合の有無にかかわらず同じですが、NHibernate がコレクションに入力するケースとそうでないケースがあります。私はそれが信頼できる動作だとは思わないので、登録を個別に照会するように戦略を変更しました。