NHibernate - как обрабатывать пользовательские сессии - PullRequest
0 голосов
/ 29 июля 2010

Полагаю, то, что мне нужно, это быстрый пример того, как это сделать.У меня свободно работает nhibernate.Я могу создавать новые записи без проблем, и читать в существующих записях без проблем.У меня проблема с пользовательским сеансом asp.net и с тем, как я справляюсь с тем фактом, что я хочу сохранить это между загрузками страниц, и я тоже хочу время от времени записывать его в базу данных.

поток я пытаюсь заставить работать что-то вроде этого:

  • Пользователь входит в систему
  • NHibernate выбирает запись пользователя
  • запись пользователя заполняется в сеансе asp.net
  • Сеанс NHibernate (я думаю) заканчивается
  • приложение отображает ссылку на страницу «добавить адрес»
  • пользователь переходит на страницу «добавить адрес»
  • пользовательвводит адресные данные
  • пользователь нажимает кнопку "отправить"
  • адрес добавляется к объекту пользователя
  • объект пользователя записывается в базу данных

При попыткечтобы записать объект пользователя (с новым адресом) обратно в базу данных, я получаю сообщение об ошибке, сообщающее, что объект пользователя уже связан с существующим сеансом.Ниже приведен код, который я использую, чтобы вывести пользователя из сеанса asp.net, добавить адрес и записать его обратно в базу данных.Только в тот момент, когда он попадает .SaveOrUpdate, что вещи идут не так, адрес добавляется к объекту отлично.

  void AddAddress_Click(object sender, EventArgs e)
  {
   var session = Global.SessionFactory.GetCurrentSession();
   User user=(User)HttpContext.Current.Session["User"];

   user.AddAddress(txtDescription.Text, txtLine1.Text, 
     txtLine2.Text, txtTown.Text, txtCounty.Text, 
     txtPostCode.Text, txtCountry.Text);

   session.SaveOrUpdate(user);
   session.Flush();
  }

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

Ответы [ 3 ]

1 голос
/ 30 июля 2010

При использовании NHibernate в приложениях asp.net я обнаружил, что следующие два правила действительно помогают мне избежать различных ловушек.

1) Использовать ровно один сеанс NHibernate для каждого запроса. Никогда не разделяйте сеанс между запросами и избегайте открытия более одного в одном запросе.

2) Не храните никакие сущности NHibernate в контексте сеанса http. Хотя NHibernate поддерживает «отсоединенные» сущности, это добавляет сложности и путаницы в код. Упрощайте, сохраняя только примитивные данные, идентификаторы и значения свойств.

1 голос
/ 29 июля 2010

Обычной практикой в ​​NHibernate является использование одного ISession на запрос.Этот подход иначе известен как «Открыть сеанс в представлении» или «OSIV».См. это и это .

0 голосов
/ 30 июля 2010

Благодаря Феликсу, я думаю, что у меня есть это сейчас. Извините, первоначальный вопрос было трудно понять, но, похоже, Феликс понял, что я имел в виду. По какой-то странной причине я не смог отредактировать вопрос с тех пор, как я его опубликовал, но сегодня вечером я снова пойду. Как вы, вероятно, можете сказать, я сначала задал вопрос, не создавая учетную запись, и теперь, когда я создал учетную запись, происходит какое-то несоответствие. Я попытаюсь решить эту проблему сегодня вечером и отдать должное, где это должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...