2011-06-30 56 views
0

我在這裏有一些奇怪的問題,我在調試時遇到了麻煩。這個應用程序以前工作正常,但自改變nhibernate配置/ sessoin管理我已經以某種方式打破它,並不能鍛鍊在哪裏。NHibernate sql查詢實際上沒有對數據庫生效

網頁和他們的帖子都似乎工作正常,更改保存到數據庫,而不是。本次交易/會話由我已經做了的HttpModule處理:

public class NHibernateSessionModule: IHttpModule 
{ 
    private INHibernateRequest _nhibRequest; 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(BeginTransaction); 
     context.EndRequest += new EventHandler(CommitAndCloseSession); 
     Console.WriteLine("Init Nhibernate module"); 
    } 

    /// <summary> 
    /// Opens a session within a transaction at the beginning of the HTTP request. 
    /// This doesn't actually open a connection to the database until needed. 
    /// </summary> 
    private void BeginTransaction(object sender, EventArgs e) 
    { 
     _nhibRequest = new NHibernateRequest(NHibernateSessionManager.Instance); 
     _nhibRequest.Start(); 
    } 

    /// <summary> 
    /// Commits and closes 
    /// </summary> 
    private void CommitAndCloseSession(object sender, EventArgs e) 
    { 
     _nhibRequest.Commit(); 
    } 

    public void Dispose() { } 
} 

這INhibernateRequest是我的自定義DLL,它的作用是:

public class NHibernateRequest : INHibernateRequest 
{ 
    private ITransaction _currentTransaction; 
    private SessionFunctions _sessionFunctions; 

    public NHibernateRequest(SessionFunctions sessionFunctions) 
    { 
     _sessionFunctions = sessionFunctions; 
    } 

    /// <summary> 
    /// Starts a session and transaction 
    /// </summary> 
    public void Start() 
    { 
     _sessionFunctions.OpenSession(); 
     _currentTransaction = _sessionFunctions.CurrentSession.Transaction; 
     _currentTransaction.Begin(); 
    } 

    /// <summary> 
    /// Closes a session and transaction 
    /// </summary> 
    public void Commit() 
    { 

     try 
     { 
      if (_currentTransaction.IsActive) 
      { 
       _currentTransaction.Commit(); 
      } 
     } 
     finally 
     { 
      _sessionFunctions.CloseSession(); 
     } 



    } 
} 

基本會話管理。這一切似乎對.aspx文件(網頁表單)正常工作。但是我有一個被調用的Web服務,它創建了一個新的實體。我的域模型主要圍繞「形式」和「問題」,這個Web服務創建了一個帶有一些問題的新表單。

我想也許這個Web服務並沒有開火的處理程序,所以我把會話東西手動(是的,這是一個有點dodgey但它只是暫時的測試)

 [WebMethod] 
    public bool CreateFormForProject(string jobNumber) 
    { 
     INHibernateRequest _nhibRequest = new NHibernateRequest(NHibernateSessionManager.Instance); 
     _nhibRequest.Start(); 
     try 
     { 
      ServiceLayer.FormsService.CreatePmqccFormForJob(jobNumber); 
      _nhibRequest.Commit(); 
      return true; 
     } catch 
     { 
      _nhibRequest.Commit(); 
      return false; 
     } 
    } 

總是Web服務返回這是真的,所以沒有拋出異常。

所以然後我試圖在網頁上做一個按鈕,使得這個調用然後顯示結果。這似乎創建了它,因爲它顯示了結果,但是當我刷新頁面時,實體不再存在,並且它從來不在數據庫中,所以我猜它必須緩存它以用於該請求。

所以我打開SQL輸出,並配置log4net吐出調試輸出窗口。這是發生了什麼:

NHibernate.SQL: 17:45:59,466 DEBUG SQL:0 - SELECT project0_.ProjectNo as ProjectNo0_0_, project0_.Name1 as Name2_0_0_, project0_.Name2 as Name3_0_0_, project0_.Project_State as Project4_0_0_, project0_.ProjectLeader as ProjectL5_0_0_, project0_1_.AdminArchived as AdminArc2_2_0_ FROM infobase.dbo.Projects project0_ left outer join infobase.dbo.Project_Archiving project0_1_ on project0_.ProjectNo=project0_1_.ProjectNo WHERE [email protected];@p0 = '11904' [Type: String (4000)] 
NHibernate.SQL: 17:45:59,692 DEBUG SQL:0 - UPDATE infobase.dbo.Projects SET Name1 = @p0, Name2 = @p1, Project_State = @p2, ProjectLeader = @p3 WHERE ProjectNo = @p4;@p0 = 'REVIT TO ACAD PREPARE AND EXPORT TOOL' [Type: String (4000)], @p1 = 'BIM SOLUTIONS API ADDIN' [Type: String (4000)], @p2 = Active [Type: Int32 (0)], @p3 = 187 [Type: Int32 (0)], @p4 = '11904' [Type: String (4000)] 
NHibernate.SQL: 17:46:02,652 DEBUG SQL:0 - INSERT INTO Forms (LastSaved, Note, Complete, MeetingId, SuggestedDeferralMonth, NextReviewDate, LastReviewDate, SuggestedProjectState, SuggestedProjectLeader, ProjectId) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9); select SCOPE_IDENTITY();@p0 = 30/06/2011 5:46:02 PM [Type: DateTime (0)], @p1 = NULL [Type: String (4000)], @p2 = False [Type: Boolean (0)], @p3 = 0 [Type: Int32 (0)], @p4 = NULL [Type: Int32 (0)], @p5 = 30/06/2011 5:45:59 PM [Type: DateTime (0)], @p6 = NULL [Type: DateTime (0)], @p7 = NULL [Type: Int32 (0)], @p8 = NULL [Type: Int32 (0)], @p9 = '11904' [Type: String (4000)] 
NHibernate.SQL: 17:46:02,735 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.PiAlertQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:02,826 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.ClientHappyQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:02,928 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.ReworkQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,028 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.ScopeOfWorksQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,130 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.TeamMeetingQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,227 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.DeadlinesQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,347 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, QuestionType) VALUES (@p0, @p1, 'PmqccDomain.DomainObjects.JobVelocityQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,433 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InvoiceAmount, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, @p3, 'PmqccDomain.DomainObjects.InvoiceAmountQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = NULL [Type: Double (0)], @p3 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,534 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.InvoiceForecastQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = Unanswered [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,630 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.ContactedClientQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = NotRequired [Type: Int32 (0)] 
NHibernate.SQL: 17:46:03,734 DEBUG SQL:0 - INSERT INTO Questions (Explanation, PmqccFormId, InputtedAnswer, QuestionType) VALUES (@p0, @p1, @p2, 'PmqccDomain.DomainObjects.AsConsQuestion'); select SCOPE_IDENTITY();@p0 = NULL [Type: String (4000)], @p1 = 8141 [Type: Int32 (0)], @p2 = NotRequired [Type: Int32 (0)] 

這正是預期的,但數據庫不會改變! SQL必須回滾或其他東西。我試着在_nhibRequest.Commit()調用之後設置一個斷點,它說事務已經提交。

所以現在我很難過,我該如何調試呢?或者任何人都可以看到我在這裏做錯的根本?

編輯: 這是從我做Web服務請求時完整的log4net調試輸出粘貼。 http://pastebin.com/mEYWiCsF

+0

我的NHibernate知識是有限的,但是當ORM定義中或者DB表本身沒有正確設置/刪除標識列時,我看到了與LINQ-to-SQL類似的行爲。 - 在你的hbm文件中,檢查Identity列是否正確定義了你的問題表? –

+0

你說你已經做了一些改變,似乎「破壞」你的代碼。你能指定他們是什麼嗎?甚至更好 - 是否有可能讓他們回滾(暫時)以查看其中哪些實際上破壞了您的應用程序? –

+0

我基本上將所有NHIbernate特定的代碼重構爲一個單獨的DLL,並將其從hbm xml文件轉換爲Fluent mapping/config.This通過除我們使用Web服務之外的所有測試。我已經做了一些更多的疑難解答,看起來當我在服務上做同樣的事情時,在aspx頁面加載時,它工作正常。我認爲這可能與交易/會話環境有關?然而,代碼沒有改變,並且它在網頁表單頁面中都可以正常工作。 .aspx頁面和我會錯過的asmx Web服務之間有一些區別嗎? – RodH257

回答

0

我終於搞定了。這實際上是與這個SO問題: NHIbernate affecting non-nhibernate queries?

我的破解是要提交併重新打開交易,這是在這裏造成的問題。我已經改變它做一個Flush,它似乎工作正常,但我很樂意爲這個問題找到一個合適的解決方案。