2009-05-20 14 views
1

IamはNHibernateおよびそのlazyloadと闘っています。NHibernate - LazyLoad one-to-zero

私は単純化した構造を持っていますが、それは私の問題を示しています。

Class Shift { 
int ShiftID; 
DateTime ShiftStart; 
Employee Employee; 
} 

Class Employee { 
int EmployeeID; 
string Name; 
} 

データ:

ShiftData 
ID       SHIFTTIME  EmployeeID (int) 
1       12:00     0 
2       13:00     1 
3       14:00     0       
4       13:00     3 


Employees 
ID       NAME 
1       Morten 
2       Peter 
3       Henrik 

シフトのための私のロード戦略は、私がシフトをロードするとNHibernateのは、自動的に左の顧客を得るために参加しないように参加し使用しています。 これは、従業員が付いているシフトでは完璧に機能しますが、シフトにはまだ従業員がいません。

シフトがロードされたら、そのようなシフトの従業員にアクセスしようとすると、データベースに対して別のSELECTが発生します(NHProfilerを使用して検出されます) これはどうしてですか?

あなたは答えが本当にこれに固執していることを願っています。

+0

EmployeeIDを0ではなくnullにする必要がありますか? – Canton

答えて

1

私の推測では、従業員のいないシフトには空のEmployeeプロキシがあるためです。 Hibernateは空のプロキシを見て、データをデータベースからロードしようとします。

解決策として、マッピングを確認することが本当に役立つでしょう。ただし、関係にfetch = "join"属性が設定されていることを確認するか、この関係のために遅延読み込みをオフにすることができます。

+0

さて、私は実際にかなりたくさん試しました。クラスとリファレンスの両方でレイジーロードを回して結合を行う。 public ShiftMap() { Not.LazyLoad(); WithTable( "shift_db"); Id(x => x.id、 "shift_id")。WithUnsavedValue(0); マップ(x => x.Starttime、 "shift_start"); 参照(x => x.Employee、 "shift_employee")。Join()。 } –

関連する問題