NHibernate ISession: после исключения ничего нельзя сохранить
У меня проблема с NHibernate ISession
, Когда я пытаюсь сохранить что-то не так в базе данных (например, сохранить сущность с дублирующим ключом на столбце XYZ) и откатиться Transaction
; ISession
Экземпляр переходит в состояние BROKEN/INVALID, которое не сохраняется ни после одной записи, и каждый раз NHibernat
выдает еще одно исключение, которое говорит мне о первом выпуске.
Я использовал методы ISession, такие как Flush, Clear, Close
но моя проблема существует. Другой подход заключается в запросе другого ISession
экземпляр из ISessionFactory
но когда я использую это, другая странная проблема: illegal attempt to associate a collection with two open sessions
,
Как восстановить экземпляр ISession без повторного запроса другого ISessionFactory
?
Заранее спасибо:)
2 ответа
Вы не можете восстановить ISession. Из документации:
Если ISession выдает исключение, вы должны немедленно откатить транзакцию, вызвать ISession.Close() и отбросить экземпляр ISession. Некоторые методы ISession не оставят сеанс в согласованном состоянии.
Кроме того, создание ISession обходится дешево, поэтому нет причин пытаться использовать его повторно. Вы, вероятно, хотите иметь ISession для каждого запроса, если у вас есть приложение MVC.
Вы не можете и не должны.
Если транзакция не удалась, вы должны прервать запрос и показать ошибку.
Логическим следствием является то, что исключения сеанса не должны быть частью вашего обычного потока.
Теперь, так как вы используете MVC, вот пример того, как может работать обработка ошибок, если вы разрешаете ошибки:
public ActionResult CreateFoo(FooModel model)
{
if (ModelState.IsValid)
{
try
{
SaveThe(model);
TheTransaction.Commit();
return RedirectToAction("Whatever");
}
catch (WhateverTheDuplicateKeyExceptionIs)
{
ModelState.AddModelError("", "Duplicate XYZ");
}
}
return View();
}