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

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

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

Кроме того, лучше всего, если я оберну как метод session.SaveOrUpdate (), так и transaction.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?

Благодарность,

1
pghtech 3 Май 2011 в 17:06

2 ответа

Лучший ответ

Рекомендуемая практика при прямом использовании 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 см. this.

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

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

Или

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

3
Iulian Margarintescu 3 Май 2011 в 18:43

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

1
Sixto Saez 3 Май 2011 в 18:31