NHibernate 3.1,发布模式和SQL没有被执行

时间:2011-05-31 19:18:04

标签: .net nhibernate exception

编辑:以下信息是导致我进行以下测试的症状。我在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 ......其他人都看到了这个?

1 个答案:

答案 0 :(得分:1)

我明白了。正如关于持久性的错误所指出的那样,NHibernate在发布模式下没有得到任何映射文件。

原因是因为当我使用PersistenceModel配置Fluent NHibernate时,我调用了PersistenceModel.AddMappingsFromThisAssembly()而不是PersistenceModel.AddMappingsFromAssembly(Assembly)。虽然前者在调试模式下工作正常,但在发布模式下显然没有。

更改我的初始化代码以使用后者修复了我的所有问题。超出范围异常的原始问题似乎是NHibernate.LINQ无法解释这个异常状态的部分。