2014-01-15 1 views
1

У меня есть следующий метод, который вызывается из Ajax:NHibernate набор ссылается свойство по идентификатору

[Authorize] 
    [ValidateInput(false)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public JsonNetResult CreateOrUpdateTimeRecord(TimeRecord tr) 
    { 

     TimeRecord trLocal; 
     if (tr.Id == -1 || tr.Id == 0) 
     { 
      trLocal = new TimeRecord 
      { 
       Description = tr.Description, 
       StartTime = tr.StartTime, 
       EndTime = tr.EndTime, 
       User =new myTimeMvc.Models.NHibernate.Models.User {Id = tr.User.Id},// _userRepo.Get(tr.User.Id), 
       Hdt = new Hdt {Id = tr.Hdt.Id}//_hdtRepo.Get(tr.Hdt.Id) 
      }; 

      _timeRepo.Insert(trLocal); 

     } 
     else 
     { 
      trLocal = _timeRepo.Get(tr.Id); 

      trLocal.Description = tr.Description; 
      trLocal.StartTime = tr.StartTime; 
      trLocal.EndTime = tr.EndTime; 

      _timeRepo.Update(trLocal); 
     } 

     ... 
    } 

Как вы можете видеть, что мой TimeRecord имеет ссылку на пользователя и HDT. Теперь я начал работать с NHibernate Profiler, который жалуется, когда я разрешаю свои свойства, загружая их из своих соответствующих репозиториев. Это ясно для меня, так как на самом деле мне не нужно запрашивать базу данных для этого, так как у меня есть идентификаторы для этих объектов.

User = _userRepo.Get(tr.User.Id), 
Hdt = _hdtRepo.Get(tr.Hdt.Id) 

Но я не 100% уверен, что если я могу использовать вместо этого:

User =new myTimeMvc.Models.NHibernate.Models.User {Id = tr.User.Id},, 
Hdt = new Hdt {Id = tr.Hdt.Id} 

Я думаю, NHibernate ленивый прокси работают точно так же, так как они содержат только идентификатор соответствующего объекта и загрузите остальное, когда это необходимо. Должен ли я приложить этот «новый» проект в любом случае к моей сессии? Может ли кто-нибудь сказать мне, как правильно это сделать?

Cheers, Стефан

ответ

1

Есть несколько способов, как достичь этого. Одним из них может быть использование метода Load(). Check Ayendes post: NHibernate – The difference between Get, Load and querying by id, выдержка:

Нагрузка никогда не будет возвращена. Он всегда возвращает объект или генерирует исключение. Поскольку это контракт, который у нас есть, допустимо для загрузки, чтобы не попасть в базу данных, когда вы ее вызываете, вместо этого можно вернуть прокси вместо.

Другими словами, мы можем сделать что-то вроде этого

User = _userRepo.Load(tr.User.Id), 
Hdt = _hdtRepo.Load(tr.Hdt.Id) 

Если Load будет инкапсулирования session.Load()

Смежные вопросы