2009-05-20 4 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? – Canton

ответ

1

Я предполагаю, что это происходит потому, что смена без сотрудников будет иметь пустой прокси-сервер Employee. NHibernate видит пустой прокси и покорно пытается загрузить данные из базы данных.

Что касается решения, то увидеть ваше отображение действительно поможет. Тем не менее, вы можете попробовать убедиться, что отношение имеет атрибут fetch = "join", установленный или отключающий ленивую загрузку для этих отношений.

+0

Ну, я на самом деле пробовал довольно много. Doing a Join, включение Lazy Load как в классе, так и в Reference. 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(). NotFound.Ignore(). Not.LazyLoad(); } –