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();
}
Другие вопросы по тегам