У меня возникают странные проблемы с 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, который имеет дело с кусками общей модели (я говорю, что есть одна модель, но есть довольно много моделей верхнего уровня, только одна, которая является наиболее важной)