Я понимаю, что вы всегда должны использовать транзакции. Я также вижу, что 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?
Благодарность,
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 при удалении сеанса. (если вы не измените режим очистки сеанса, но дело не в этом).
Я бы воздержался от микроуправления транзакцией в таком репозитории. Этот пост хорошо объясняет почему добавление семантики базы данных в ваш репозиторий не является хорошей идеей при использовании NHibernate (или любого другого ORM). Лучше всего реализовать шаблон единицы работы. для вашей бизнес-логики.
Похожие вопросы
Связанные вопросы
Новые вопросы
nhibernate
NHibernate - это объектно-реляционный картограф с открытым исходным кодом (ORM) для .NET Framework.