我在這裏有一些奇怪的問題,我在調試時遇到了麻煩。這個應用程序以前工作正常,但自改變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
我的NHibernate知識是有限的,但是當ORM定義中或者DB表本身沒有正確設置/刪除標識列時,我看到了與LINQ-to-SQL類似的行爲。 - 在你的hbm文件中,檢查Identity列是否正確定義了你的問題表? –
你說你已經做了一些改變,似乎「破壞」你的代碼。你能指定他們是什麼嗎?甚至更好 - 是否有可能讓他們回滾(暫時)以查看其中哪些實際上破壞了您的應用程序? –
我基本上將所有NHIbernate特定的代碼重構爲一個單獨的DLL,並將其從hbm xml文件轉換爲Fluent mapping/config.This通過除我們使用Web服務之外的所有測試。我已經做了一些更多的疑難解答,看起來當我在服務上做同樣的事情時,在aspx頁面加載時,它工作正常。我認爲這可能與交易/會話環境有關?然而,代碼沒有改變,並且它在網頁表單頁面中都可以正常工作。 .aspx頁面和我會錯過的asmx Web服務之間有一些區別嗎? – RodH257