编辑:以下信息是导致我进行以下测试的症状。我在Release模式下下载,编译并运行了NHibernate的所有测试。他们都工作。我启动了NH Profiler并查看了Debug和Release中的日志之间的区别。除了事务open和close语句之外,Release似乎没有执行任何SQL。使用SQL事件探查器验证了这一事实。
因此NHibernate可以连接到数据库并执行事务开始/结束语句,我也可以通过普通的ADO方法连接和执行任意SQL,但NHibernate不能在Release模式下执行任何其他SQL。
我的会话在每个请求的开始和结束时通过HttpModule打开和关闭,HttpModule在UnitOfWork实现中使用SessionFactory单例,该实现由Structuremap缓存在HttpContext中。
这一切都在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
触发这个的代码只是对NHibernate的简单Session.Load(id)调用。
原始
运行NHibernate 3.1时,我收到“索引超出范围”异常,但仅在发布模式下进行编译时。我在这里打电话给NHibernate:
var results = Session.Query<User>.Where(predicate);
然后在这下面,我正在检查有多少返回(因为这实际上是我的存储库中的FindOne()方法,我需要确保我只返回一个)。所以我调用的是result.Count(),它触发NHibernate查询执行。
我的堆栈跟踪显示在方法的最后一行(即“返回结果[0]”)中的NhQueryprovider.ExecuteQuery中发生了这种情况。我唯一可以得到的是,显然NHibernate在那里得到一个空列表(它不应该至少应该返回一个结果......)这导致了这一点。
这可能是NHibernate.Linq中的一个尚未捕获的错误,因为我相信它只是在3.x中原生于Nhibernate ......其他人都看到了这个?
答案 0 :(得分:1)
我明白了。正如关于持久性的错误所指出的那样,NHibernate在发布模式下没有得到任何映射文件。
原因是因为当我使用PersistenceModel配置Fluent NHibernate时,我调用了PersistenceModel.AddMappingsFromThisAssembly()
而不是PersistenceModel.AddMappingsFromAssembly(Assembly)
。虽然前者在调试模式下工作正常,但在发布模式下显然没有。
更改我的初始化代码以使用后者修复了我的所有问题。超出范围异常的原始问题似乎是NHibernate.LINQ无法解释这个异常状态的部分。