NHibernate交易没有关闭

时间:2010-08-20 21:17:14

标签: c# unit-testing nhibernate nhibernate-mapping

出于对学习幕后工作的兴趣,我正在运行一些测试方法,专门通过NHibernate将数据转储到我的数据库。我正在使用各种映射设置,并且正在通过最新版本的NHProfiler观察会话过程。

我注意到一些奇怪的东西,它可能不会引起关注,但我想我会用intertubes检查:

[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仅显示第一个事务和第一个select语句的初始打开。我错过了什么?由于该方法实际上正在工作,我倾向于不管它,但我也担心如果NHProf没有看到其余的陈述,可能还有其他错误。

1 个答案:

答案 0 :(得分:3)

您可能需要调用ProfilerInfrastructure.FlushAllMessages();强制NHProf清除其所有消息,以便您可以查看结束事务语句。我在[TearDown]类的[SetUpFixture]方法中为NUnit调用此方法。