Транзакции NHibernate не закрываются - PullRequest
0 голосов
/ 21 августа 2010

Из интереса узнать, что происходит за кулисами, я использую некоторые методы тестирования, которые специально передают данные в мою базу данных через NHibernate. Я играю с различными настройками сопоставления и наблюдаю за процессами сеанса через последнюю версию NHProfiler.

Я заметил кое-что странное, и это, возможно, не вызывает беспокойства, но подумал, что я уточню в трубках:

[Test]
    public void Seed_Default_Users()
    {
        Role adminRole;
        var user = new User { UserName = "nkirkes", IsActive = true, Email = "nkirkes@dtsagile.com" };
        using (var sesh = _sessionFactory.OpenSession())
        {
            userRepo = new NHibernateRepository<User>(sesh);
            roleRepo = new NHibernateRepository<Role>(sesh);

            using (var tx = sesh.BeginTransaction())
            {
                // get the administrators role
                adminRole = roleRepo.Entities.FirstOrDefault(x => x.Name == "Administrator");
                tx.Commit();
            }

            // set up the object relationship from user -> role
            user.AddRole(adminRole);

            using (var tx = sesh.BeginTransaction())
            {
                // save it
                userRepo.Save(user);
                tx.Commit();
            }
        } 
    }

И полученный результат в NHProf:

-- statement #1
begin transaction with isolation level: Unspecified

-- statement #2
select *
from   (SELECT this_.ROLE_ID as ROLE1_2_0_,
           this_.Name    as Name2_0_
    FROM   ROLES this_
    WHERE  this_.Name = 'Administrator' /* :p0 */)
where  rownum <= 1 /* :p1 */

И это все. Теперь вставка на самом деле происходит, но NHProf показывает только начальное открытие 1-й транзакции и первый оператор выбора. Что мне не хватает? Поскольку метод действительно работает, я склонен оставить его в покое, но я также боюсь, что если NHProf не увидит остальные утверждения, возможно, что-то еще не так.

1 Ответ

3 голосов
/ 21 августа 2010

Возможно, вам придется позвонить ProfilerInfrastructure.FlushAllMessages();, чтобы заставить NHProf сбросить все свои сообщения, чтобы вы могли увидеть оператор завершения транзакции.Я вызываю это в методе [TearDown] в моем классе [SetUpFixture] для NUnit.

...