2009-05-20 44 views
1

Iam苦苦与NHibernate和它的lazyload。NHibernate - LazyLoad一比零

我有一个结构,我简化了但显示我的问题。

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的自动执行一个LEFT JOIN来获得客户。 这对于附加员工的班次来说非常合适,但是有些班次还没有任何员工。

当我尝试访问该班次的员工时,一旦加载班次,它会导致另一个对数据库的SELECT(通过使用NHProfiler发现) 为什么会发生这种情况?

希望你有一个答案iam真的坚持这一点。

+0

应该Employeeid为null而不是0吗? – Canton 2009-09-20 13:05:20

回答

1

我的猜测是,这是因为没有员工的变化将有一个空Employee代理。 NHibernate看到空的代理并尽职地尝试从数据库加载数据。

至于解决方案,看看你的映射真的有帮助。但是,您可以尝试确保关系具有fetch =“join”属性集或关闭此关系的延迟加载。

+0

嗯,我实际上尝试了很多。做一个加入,在类和引用上都调用Lazy Load。 公开ShiftMap() { Not.LazyLoad(); WithTable(“shift_db”); Id(x => x.id,“shift_id”)。WithUnsavedValue(0); Map(x => x.Starttime,“shift_start”); 引用(x => x.Employee,“shift_employee”)。Join()。NotFound.Ignore()。Not.LazyLoad(); } – 2009-05-21 07:27:44