2012-04-05 4 views
0

У меня проблема с NHibernate ISession. Когда я пытаюсь сохранить что-то неправильно в базе данных (например, сохранить объект с дубликатным ключом на XYZ col) и откат Transaction; ISession экземпляр переходит в состояние BROKEN/INVALID, которое после этого не сохраняет никакой записи, и каждый раз, когда NHibernat выдает другое исключение, которое сообщает мне о проблеме первого раза.NHibernate ISession: ничто не может быть сохранено после исключения

Я использовал методы ISession, такие как Flush, Clear, Close, но моя проблема существует. Другой подход заключается в запросе другого ISession экземпляра от ISessionFactory, но когда я использую это, возникает еще одна странная проблема: illegal attempt to associate a collection with two open sessions.

Как восстановить экземпляр ISession без повторного запроса другого от ISessionFactory?

Заранее спасибо :)

+0

У вас есть свойство lazyload на этой модели? –

+0

Да! Многие загруженные свойства Lazy (Navigation, Collections) – Sadegh

+0

Если вы запрашиваете некоторые свойства, это может быть проблемой. –

ответ

1

Вы не можете восстановить ISession. Из documentation:

Если ISession генерирует исключение, вы должны немедленно откатить транзакции, вызовите ISession.Close() и отбрасывать экземпляр ISession . Некоторые методы ISession не покидают сессию в согласованном состоянии .

Также creating ISession is cheap, поэтому нет причин пытаться его повторно использовать. Вероятно, вы хотите иметь ISession для запроса, если у вас есть приложение MVC.

1

Вы не можете, и вы не должны.

Если транзакция не удалась, вы должны прервать запрос и показать ошибку.

Логическое следствие состоит в том, что исключения сеанса не должны быть частью вашего регулярного потока.

Теперь, так как вы используете 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(); 
} 
Смежные вопросы