2011-05-31 23 views
0

編輯:以下信息是導致我進行以下測試的症狀。我下載,編譯並在釋放模式下運行NHibernate的所有測試。他們都工作。我啓動了NH Profiler並查看了Debug和Release中日誌的區別。除了事務打開和關閉語句之外,發佈似乎沒有執行任何SQL。用SQL分析器驗證了這一事實。因此,NHibernate可以連接到數據庫並執行事務開始/結束語句,我也可以通過普通的ADO方法連接和執行任意SQL,但是NHibernate不能在釋放模式下執行任何其他SQL。NHibernate 3.1,發佈模式和SQL沒有得到執行

我的會話在每個請求的開始和結束時通過一個HttpModule被打開和關閉,HttpModule在一個UnitOfWork實現中使用一個SessionFactory單例,這個單例在HttpContext中被Structuremap緩存。

它在Debug下運行得非常好。

而且,改變了我的調用代碼,以確保第一叫NHibernate的方法是一種負載返回該對我說:

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()方法在我的倉庫,我需要確保我只拿回一個)。所以我打電話給results.Count(),它觸發NHibernate查詢執行。

我的堆棧跟蹤顯示,這是發生在方法的最後一行NhQueryprovider.ExecuteQuery(這是「返回結果[0]」)。我唯一能從中得到的是顯然NHibernate在那裏得到一個空列表(它不應該至少有一個結果返回到這裏),這是造成這種情況的原因。

這可能是NHibernate.Linq中還沒有被捕獲的東西中的一個錯誤,因爲我相信在3.x中本地化了Nhibernate ......任何人都看到了這個?

+0

哦,這是一個有趣的事實。如果我刪除了違規的.Count()行,我沒有得到任何異常...但在通過NHProfiler檢查所有內容時,我也沒有看到任何實際執行的SQL。這就像發佈模式觸發某些類型的錯誤時使用.Query 語法不實際執行任何查詢... – 2011-05-31 20:14:07

+0

我有一個奇怪的錯誤與NHibernate驗證程序相關,只發生在發佈模式,但它不是實際上NHV。檢查這篇文章,看看它是否可以幫助你:http://stackoverflow.com/questions/5590130/nhibernate-validator – 2011-05-31 20:22:58

+0

嗯,我沒有通過VS運行這個,我在IIS中運行它... – 2011-05-31 20:33:30

回答

1

我想通了。正如持久化錯誤指出的那樣,NHibernate沒有在發佈模式下獲取任何映射文件。

原因原來是因爲當我用PersistenceModel配置Fluent NHibernate時,我打電話給PersistenceModel.AddMappingsFromThisAssembly()而不是PersistenceModel.AddMappingsFromAssembly(Assembly)。雖然前者在調試模式下工作正常,但在發佈模式下顯然沒有。

更改我的初始化代碼使用後者修復了我的所有問題。最初的問題,超出範圍的異常,似乎是NHibernate.LINQ解決這個異常狀態的一部分。

+1

你能提交一個錯誤嗎?我敢肯定NH團隊想聽聽這個。 – csano 2011-06-02 21:13:23