Редактировать: Приведенная ниже информация была симптомом, который привел меня к следующим тестам.Я скачал, скомпилировал и запустил все тесты для 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 ... Кто-нибудь еще видел это?