Как настроить Nhibernate, чтобы не сохранять объект в текущем сеансе

#asp.net-mvc #nhibernate #asp.net-mvc-3 #c#-4.0

#asp.net-mvc #nhibernate #asp.net-mvc-3 #c #-4.0

Вопрос:

У меня есть три объекта: пользователи, роли и разрешения. Есть два контроллера: UserController и RolePermissionController. Весь контроллер, обернутый сеансом Nhibernate.

Когда я создаю разрешения на заполнение роли, пользователь не существует. Итак, я сохраняю свой новый объект разрешений в сеансе ASP.MVC. Я хочу сохранить новую роль с разрешением, когда я создам пользователя в UserController.

Но когда я заполнил новую роль разрешением exist (которое я затем получил из базы данных с помощью Nhibernate) и перешел к пользовательскому контроллеру, была создана новая роль объекта, без сеанса вызова.saveOrUpdate или любые другие методы.

Я попытался использовать Execut после заполнения моей новой роли существующими разрешениями:

 Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<ISession>().Evict(newRole);
  

Но это не помогло.
Итак, я хочу сказать Nhibernate — не сохраняйте объект в этой транзакции (RolePermissionController) — и сохраните как подключенный к объектам пользовательского объекта в UserController.

Комментарии:

1. Я предполагаю, что в ваших сопоставлениях настроен каскад от разрешения к роли.

2. Я так не думаю. Проблема в сеансе Nhibernate, а не в каскаде.

3. вы уверены, что объект сеанса, для которого вы вызываете функцию выселения (), тот же, что используется в RolePermissionController? Я бы использовал. GetHashCode(), чтобы убедиться, что это тот же объект.

Ответ №1:

Это не дает прямого ответа на ваш вопрос, но все же может быть решением — как насчет сбора всей информации через ViewModel, чтобы в итоге вы получили одно действие контроллера, которое берет информацию из ViewModel, создает роль и пользователя одновременно (т. Е. Во время одного запроса), и нет необходимости в беспорядочных сеансовых материалах.

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