NHibernate 3.1, режим выпуска и SQL не выполняются - PullRequest
0 голосов
/ 31 мая 2011

Редактировать: Приведенная ниже информация была симптомом, который привел меня к следующим тестам.Я скачал, скомпилировал и запустил все тесты для NHibernate в режиме Release.Они все работают.Я запустил NH Profiler и посмотрел на разницу между журналами в Debug и Release.Похоже, что Release не выполнял никакого SQL, кроме операторов открытия и закрытия транзакции.Подтвердил этот факт с помощью профилировщика SQL.

Таким образом, NHibernate может подключиться к базе данных и выполнить операторы начала / конца транзакции, а также я могу подключиться и выполнить произвольный SQL с помощью обычных методов ADO, но NHibernate НЕ МОЖЕТ выполнитьлюбой другой SQL в режиме Release.

Мой сеанс открывается и закрывается в начале и конце каждого запроса через HttpModule, который использует синглтон SessionFactory внутри реализации UnitOfWork, которая кэшируется в HttpContext посредством Structuremap.

В Debug все прекрасно работает.

Кроме того, изменение моего вызывающего кода, чтобы убедиться, что первый вызванный метод NHibernate - это Load, возвращает мне:

Unable to locate persister: Domain.Model.User

Редактировать 2: Вот трассировка стека ...

[HibernateException: Unable to locate persister: STEP.Domain.Model.User]
   NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:58
   NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2466
   NHibernate.Impl.SessionImpl.Load(String entityName, Object id) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1213
   NHibernate.Impl.SessionImpl.Load(Type entityClass, Object id) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1242
   NHibernate.Impl.SessionImpl.Load(Object id) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1166
   STEP.Persistence.Repositories.RepositoryWithTypedId`2.Load(TId id) in C:\Projects\STEP Handbook Dev\src\STEP.Persistence\Repositories\Repository.cs:80
   STEP.Website.Providers.STEPNHibernateMembershipProvider.ValidateUser(String username, String password) in C:\Projects\STEP Handbook Dev\src\STEP.Website\Providers\STEPNHibernateMembershipProvider.cs:490
   STEP.Website.Controllers.AccountController.LogOn(LogOnViewModel model, String returnUrl) in C:\Projects\STEP Handbook Dev\src\STEP.Website\Controllers\AccountController.cs:759
   lambda_method(Closure , ControllerBase , Object[] ) +179
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +129
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +785306
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +785306
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +785306
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +785306
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +785360
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371

И код, который вызывает это просто вызов Session.Load (id) дляNHibernate.

Оригинал:

При запуске NHibernate 3.1 я получаю исключение "Индекс был вне диапазона", но только при компиляции в режиме Release.Я звоню NHibernate здесь:

var results = Session.Query<User>.Where(predicate);

Затем прямо под этим я проверяю, сколько я получаю (так как на самом деле это мой метод FindOne () в моем хранилище, и мне нужно убедиться, чтоЯ получаю только один назад).Поэтому я вызываю results.Count (), который запускает запрос NHibernate.

Моя трассировка стека показывает, что это происходит в NhQueryprovider.ExecuteQuery в последней строке метода (который есть), возвращающий результаты[0] ").Единственное, что я могу извлечь из этого, это то, что NHibernate, очевидно, возвращает туда пустой список (здесь не должно быть хотя бы одного результата, возвращенного здесь ...), что и вызывает это.

Это МОЖЕТ быть ошибкой в ​​материале NHibernate.Linq, который еще не был обнаружен, так как я считаю, что он был встроен в Nhibernate в 3.x ... Кто-нибудь еще видел это?

1 Ответ

1 голос
/ 03 июня 2011

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

Причина оказалась в том, что когда я конфигурировал Fluent NHibernate с PersistenceModel, я былзвонить PersistenceModel.AddMappingsFromThisAssembly() вместо PersistenceModel.AddMappingsFromAssembly(Assembly).В то время как первый работал нормально в режиме отладки, в режиме релиза он, очевидно, не работает.

Изменение кода инициализации для использования последнего решило все мои проблемы.Похоже, что первоначальная проблема, за исключением вне диапазона, является ошибкой NHibernate.LINQ, чтобы объяснить это исключительное состояние.

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