ASP Mvc Nhibernate Выпуск - PullRequest
       12

ASP Mvc Nhibernate Выпуск

0 голосов
/ 16 июня 2011

У меня возникают странные проблемы с Nhibernate в моем веб-приложении MVC.

Не существует 1 непротиворечивой ошибки, я постоянно получаю множество случайных:

  • Транзакция не была успешно запущена
  • Новый запрос не может быть запущен, потому что он должен идти с допустимым дескриптором транзакции
  • Неожиданный счетчик строк: -1; ожидается: 1

Чтобы дать небольшой контекст настройке, я использую Ninject для DI сессий и других связанных с Nhibernate объектов, в настоящее время я использую RequestScope, однако я пробовал SingletonScope. У меня есть большая и сложная модель данных, которая считывается целиком, но сохраняется в отдельных частях, поскольку все они могут редактироваться и сохраняться по отдельности.

Примером может служить объект Customer, который содержит объект адреса, объект контакта, объект друзей, объект предыдущих заказов и т. Д. И т. Д. *

Таким образом, весь объект считывается, затем сопоставляется с моделями домена пользовательского интерфейса и затем отображается в различных частях на странице. Каждый фрагмент может быть обновлен индивидуально через ajax, поэтому вы можете обновить 1 раздел или обновить их все вместе. Похоже, в основном это вызывает у меня проблемы, когда я пытаюсь сохранить их все вместе (поэтому 2-4 одновременных запроса Ajax сохраняют фрагменты модели).

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

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

У кого-то еще были проблемы с транзакциями / nhibernate, подобные этой, в приложении ASP MVC ... Я знаю, что это может быть немного расплывчато, поскольку ошибки не указывают на одну вещь, и это не всегда ошибка, поэтому его как колоть в темноте, но у меня нет идей, поэтому любая помощь будет отличной!

- Обновление -

Я не могу опубликовать весь соответствующий код, так как проект огромен, но бит транзакции выглядит так:

using (var transaction = sessionManager.Session.BeginTransaction(IsolationLevel.ReadUncommitted))
            {
                try
                {
                    // Do unit of work
                    transaction.Commit();

                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }

Вот некоторые из основных проблем, с которыми я столкнулся в этом проекте:

  • Существует несколько отношений 1-1 с составными ключами, но логически это имеет смысл
  • Объекты домена Nhibernate проходят уровень отображения, чтобы стать объектами домена UI, и наоборот при сохранении. Проблема здесь заключается в том, что при отображении 1-1 при сохранении примера Address необходимо создать объект Surrogate Customer с правильным Id, а затем объединить.
  • Есть ALOT Ajax, который имеет дело с кусками общей модели (я говорю, что есть одна модель, но есть довольно много моделей верхнего уровня, только одна, которая является наиболее важной)

1 Ответ

0 голосов
/ 10 мая 2012

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

  • SessionFactory должен быть создан как singleton, а сессия - для каждого веб-запроса.Что-то вроде:

        Bind<ISessionFactory>()
            .ToProvider<SessionFactoryBuilder>()
            .InSingletonScope();
    
        Bind<ISession>()
            .ToMethod( context => context.Kernel.Get<ISessionFactory>().OpenSession() )
            .InRequestScope();
    
  • Будьте осторожны, чтобы транзакции оставались открытыми слишком долго, держите их как можно более короткими, чтобы избежать тупиков.

  • Проверьте своиЗапросы выполняются, как и ожидалось, с помощью такого инструмента, как NHProf.Часто люди загружают слишком много графика, что влияет на производительность и может создавать тупики.
  • Проверьте свои сопоставления на наличие таких вещей, как not.lazyload (), и посмотрите, действительно ли вам нужны дополнительные данные в запросах, и результаты должны быть возвращены до минимума.Проверьте планы выполнения ваших запросов и убедитесь, что имеются соответствующие индексы.
  • У меня были проблемы с кэшированием фильтров действий mvc3, что означало, что транзакции не всегда запускались, но пытались закрыться, вызывая проблемы.Все транзакции моей транзакции перенесены в ActionResults в контроллерах, чтобы транзакция была максимально короткой и близкой к действию.
  • Проверяйте каскады в ваших сопоставлениях и сводите обновления к минимуму.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...