FindAll после SaveOrUpdate не возвращает обновления - PullRequest
0 голосов
/ 13 января 2010

У меня есть метод, который запрашивает в базе данных (в данном случае представлении) родительские записи, получает и обновляет дочерний элемент каждой родительской записи, сохраняет дочернюю запись и затем запрашивает родительские записи.Между дочерним и родительским объектами существует однозначное отношение, но оно не определено в файлах сопоставления.Я вижу, что обновления сохраняются в базе данных путем непосредственного выбора выбора для базы данных, но когда я делаю второй запрос в коде, обновления не включаются в результаты.Почему второй запрос не возвращает обновления?

Грубый набросок кода:

public void UpdateRecords(long aParentId)
{
   IList<Parent> parents = parentRepository.GetParentById(aParentId);
   foreach (Parent parent in parents)
   {
      Child childToUpdate = childRepository.GetChildById(parent.GetChildId());

      ... Update Child ...

      childRepository.SaveChild(childToUpdate);
   }
   IList<Parent> parents = parentRepository.GetParentById(aParentId);
}

class ParentRepository : NHRepository
{
   public IList<Parent> GetParentById(long anId)
   {
      DetachedCriteria criteria = 
         DetachedCriteria.For<Parent>()
         .Add(Restrictions.Eq("Id", anId));

      return FindAll(criteria).ToList();
   }
}

class ChildRepository : NHRepository
{
   public Child SaveChild(Child aChild)
   {
      Child savedChild = null;
      using (UnitOfWork.Start())
      {
         savedChild = base.SaveOrUpdate(aChild);
         UnitOfWork.Current.Flush(); // commit
      }
      return savedChild;
   }
}

Ответы [ 2 ]

0 голосов
/ 13 января 2010

Попробуйте окружить свой SaveUpdate () в транзакции. Затем завершите транзакцию, когда она будет завершена, это обеспечит запись ваших изменений в базу данных сразу после фиксации:

Примерно так можно увидеть:

using (var trans = session.BeginTransaction()) {
  session.SaveUpdate(e);
  trans.Commit()
} catch (Exception) {
  trans.Rollback()
}
0 голосов
/ 13 января 2010

Как выглядит ваш метод FindAll ()? Возможно, он использует один и тот же UnitOfWork / Session для обоих вызовов GetParentById (), а дочерний репозиторий использует другой UnitOfWork / Session.

Если это так, то второй вызов GetParentById () возвращает объект из кэша сеанса (первого уровня) без попадания в базу данных.

Редактировать: Вы можете просмотреть исходный код Rhino.Commons на:

https://rhino -tools.svn.sourceforge.net / svnroot / носорог-инструменты / багажник / Обще / Rhino.Commons.NHibernate /

Сессия инкапсулирована в классе Rhino.Commons.UnitOfWork. Я не знаком с реализацией UnitOfWork Ayende, поэтому я не смогу дать вам лучшее решение для этого, но вот кое-что, с чего можно начать ....

Попробуйте позвонить

Session.Clear();

в верхней части вашего метода GetParentById ().

Я повторяю, вам, вероятно, потребуется найти лучший способ сделать это (возможно, с помощью UnitOfWork), но это должно очистить все объекты из вашего кэша сеанса и, следовательно, загрузить новые из базы данных при следующем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...