SQL-запросы NHibernate фактически не действуют на базу данных - PullRequest
0 голосов
/ 30 июня 2011

У меня тут какая-то странная проблема, связанная с отладкой. Ранее это приложение работало нормально, но после изменения конфигурации / управления sessoin в nhibernate я как-то сломал его и не могу тренироваться где.

Кажется, что все веб-страницы и их посты работают нормально, изменения сохраняются в базе данных, а что нет. Транзакция / сеансы обрабатываются 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 (веб-форм). Но у меня есть веб-сервис, который называется, который создает новую сущность. Моя модель предметной области сфокусирована на «формах» и «вопросах», этот веб-сервис создает новую форму с некоторыми вопросами.

Я подумал, что, возможно, этот веб-сервис не запускает обработчик, поэтому я добавил материал сеанса вручную (да, это немного хитро, но это только временная проверка)

        [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;
        }
    }

Веб-сервис всегда возвращает 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 (), и он сказал, что транзакция была зафиксирована.

Так что теперь я в тупике, как я могу отладить это? или кто-нибудь может увидеть что-то фундаментальное, что я здесь делаю неправильно?

EDIT: Вот вставка полного отладочного вывода log4net, когда я делаю запрос веб-службы. http://pastebin.com/mEYWiCsF

1 Ответ

0 голосов
/ 04 июля 2011

Я наконец-то решил это.На самом деле это было связано с таким вопросом: NHIbernate, влияющий на запросы без nhibernate?

Мой хак, чтобы обойти это было, чтобы зафиксировать и открыть транзакцию, которая вызывала проблемы здесь.Вместо этого я изменил его на Flush, и, похоже, он работает нормально, хотя я бы хотел найти правильное решение для этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...