我在这里遇到一些奇怪的问题,我在调试时遇到了麻烦。这个应用程序以前工作正常,但自从改变nhibernate配置/ sessoin管理我以某种方式打破它,并不能在哪里锻炼。
网页和他们的帖子都可以正常工作,更改会保存到数据库中,而不是。事务/会话由我做过的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服务创建了一个带有一些问题的新表单。
我想也许这个网络服务没有触发处理程序,所以我手动输入会话内容(是的,这有点过时,但它只是临时测试)
[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服务始终返回true,因此不会抛出异常。
然后我尝试在网页上创建一个按钮,然后进行此调用,然后显示结果。这似乎创建了它,因为它显示了结果,但是当我刷新页面时,实体不再存在,并且它从未出现在数据库中,所以我想它必须为该请求缓存它。
所以我打开了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 project0_.ProjectNo=@p0;@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 :(得分:0)
我终于解决了。这实际上与这个SO问题有关: NHIbernate affecting non-nhibernate queries?
我解决这个问题的方法是提交并重新打开事务,这会导致问题。我改为将其改为Flush,它似乎工作正常,但我很乐意为这个问题找到合适的解决方案。