2012-12-28 27 views
4

У меня есть сценарий, подобный этому: Веб-сайт Asp.NET MVC 4 с использованием сеанса nHibernate для запроса. Сессия вводится с использованием Ninject в репозиторий с помощью методов Get и Save.nHibernate-сессия для каждого запроса и управления исключениями

Есть много статей, в которых говорится о сеансе за запросом и говорится, что это способ сделать что-то в веб-приложении.

но у меня возникают проблемы, реализующей логику, как этот:

Read Data From Database 
Alter Entity information 
Save to Database 
Read another entity 
Alter entity 
Save ... but an EXCEPTION OCCURS 

Я хочу, чтобы показать свою точку зрения с сообщением пользователя. Но я также должен обновить полученную веб-страницу, , поэтому мне также нужно прочитать некоторую информацию из базы данных.

Согласно NHibernate документации, сессия за исключением должна быть отброшен Documentation Here

Но я не могу найти ни одной статьи о лучшем способе, чтобы продолжить здесь.

Каков наилучший подход для этой ситуации ?. Мне нужно будет добавить новый сеанс к моему объекту репозитория ?.

Спасибо.

ответ

4

Вы можете создать новый сеанс из свойства SessionFactory исходного сеанса. Вы можете получить доступ к исходному объекту сеанса, либо обнажая его в классе репозитория, либо введя его в контроллер. Затем вы можете создать новый репозиторий с новым сеансом.

Я делаю это в некоторых своих действиях, где я ожидаю появления уникальных ключевых нарушений, и мне приходится перезагружать данные поиска в модели. Вот пример:

public ActionResult Create(MeasuresEditView model) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var txn = _session.BeginTransaction()) 
      { 
       try 
       { 
        var measure = new Measure { Code = model.Code }; 
        _session.Save(measure); 
        txn.Commit(); 
        return RedirectToAction("Index"); 
       } 
       catch (UniqueKeyException) 
       { 
        txn.Rollback(); 
        var msg = string.Format("A measure with the code '{0}' already exists, please enter a different code or cancel.", model.Code); 
        ModelState.AddModelError("Code", msg); 
       } 
       catch (Exception ex) 
       { 
        if (txn.IsActive) 
        { 
         txn.Rollback(); 
        } 
        log.Error("Create", ex); 
        throw; 
       } 
      } 
     } 
     // have to rebuild selectlist on post in new txn in case it was rolled back 
     using (var session = _session.SessionFactory.OpenSession()) 
     using (var txn = session.BeginTransaction()) 
     { 
      SetProductGroupSelectList(session, model, manualId); 
      txn.Commit(); 
     } 
     return View(model); 
    } 
+0

Спасибо, я буду использовать его в качестве базовой линии для моего решения. Я попытаюсь интегрировать его с шаблоном Repository и Unit of Work. –

 Смежные вопросы

  • Нет связанных вопросов^_^