Нужна помощь в понимании транзакций Nhibernate и как не дублировать код (если это возможно) - PullRequest
1 голос
/ 03 мая 2011

Я понимаю, что вы всегда должны использовать транзакции.Я также вижу, что NHibernate.ITransaction реализует Dispose, поэтому мне нужно обернуть свой объект ITransaction в оператор использования.Значит ли это, что для каждого не репозитивного метода (т.е. обновления, редактирования ...) я должен объявить:

using (ITransaction _transaction = _session.BeginTransaction(//isolationlevel)) {
  //procedure code here
}

Есть ли способ, которым я могу обернуть это (я не вижучто я могу).

Кроме того, лучше ли мне обернуть как метод session.SaveOrUpdate (), так и транзакцию.Commit () в Try / Catch?

using (_transaction = _session.BeginTransaction(IsolationLevel.ReadCommitted) {
  try {
    _session.SaveOrUpdate(entity);
      try {
        _transaction.Commit();
      catch (//some exception ex) {
        _transaction.RollBack();
      }
  }
  catch (//some exception ex) {
    //log ex
  }
}

ИлиЕсть ли лучший способ, такой как использование методов сеанса и транзакции в одном и том же try / catch?

Спасибо,

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Рекомендуемая практика при использовании ISession напрямую: (вы должны использовать транзакцию даже для чтения)

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    // all the code that uses the session goes here
    // use session to load and/or save entity
}

Это в основном создание единицы работы.

В зависимости от контекста вашей операции (веб-запрос, запрос wcf) может потребоваться, чтобы все операции выполнялись в одной единице работы. Для веб-запроса см. это для операции WCF см. это .

Кроме того, как сказал Сиксто Саез, вызов SaveOrUpdate - это запах. В большинстве случаев у вас есть один из этих двух случаев:

1 Вы создаете новую сущность и вызываете session.Save (entity);

или

2 Вы получаете сущность или больше из сеанса (с помощью Get / Load или по запросу), изменяете сущность, и изменения будут сохранены nhibernate при удалении сеанса. (если вы не измените режим очистки сеанса, но это не главное).

1 голос
/ 03 мая 2011

Я бы держался подальше от микро-управления транзакцией в таком репозитории. Этот пост хорошо объясняет , почему добавление семантики базы данных в ваш репозиторий не является хорошей идеей при использовании NHibernate (или любого другого ORM).Наилучшая практика заключается в реализации шаблона единицы работы для вашей бизнес-логики.

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