NHibernate Get()后跟刷新或提交?

NHibernate Get()后跟刷新或提交?,nhibernate,transactions,unit-of-work,flush,Nhibernate,Transactions,Unit Of Work,Flush,我的ISession对象的FlushMode是FlushMode.Commit 我使用此处定义的工作单元和存储库模式: 我记得看到过一些例子,其中一些人在调用Get()后立即执行刷新或事务提交。我们是他们刚刚失去理智,还是有理由这么做 根据我的测试: [TestMethod] public void TestMethod1() { Employee e; IRepository<Employee> empRepo;

我的ISession对象的FlushMode是FlushMode.Commit

我使用此处定义的工作单元和存储库模式:

我记得看到过一些例子,其中一些人在调用Get()后立即执行刷新或事务提交。我们是他们刚刚失去理智,还是有理由这么做

根据我的测试:

    [TestMethod]
    public void TestMethod1()
    {
        Employee e;

        IRepository<Employee> empRepo;
        using(UnitOfWork.Start(Enums.Databases.MyDatabase))
        {
            empRepo = new Repository<Employee>();
            e = empRepo.GetByID(21);
        }

        Debug.WriteLine(e.UserName);
    }
[TestMethod]
公共void TestMethod1()
{
雇员e;
间接回购;
使用(UnitOfWork.Start(Enums.Databases.MyDatabase))
{
empRepo=newrepository();
e=empRepo.GetByID(21);
}
Debug.WriteLine(即用户名);
}

我的GetByID存储库函数只调用Session.Get(id),我可以在输出窗口中查看用户名(在会话终止后)。。。那么,在Get()之后进行任何类型的刷新或事务提交有什么意义呢?我会理解是否有保存在那里。

NHibernate假设所有数据库操作都在事务中完成,因此人们显式地使用它们,而不是让NHibernate,RDBMS隐式地使用它们

Ayende在他的帖子中更详细地解释了这一点


编辑:今天学到了一些新东西。不是NHibernate使用隐式事务,而是DB。

我想你的意思是……”而不是让
RDBMS
隐式使用它们。@dotjoe实际上,不是。也许我误解了这个概念,但我的印象是,如果我们不显式使用事务,NHibernate将在其自己的事务中执行每一条语句。这就是我在写NHibernate时的意思,它隐式地使用事务。如果您不在显式事务中,那么RDBMS将在它自己的事务中执行每个单独的语句。我很确定NH不会为你创造它们……dotjoe是正确的(我相信)。RDBMS将所有内容包装在一个事务中。NHibernate只允许您指定什么类型的事务——readcommitted、readuncommitted等等,而且我相信它通过将查询分组到单个事务中而不是在一个事务中,来防止到RDBMS的往返multiple@ChrisKlepeis您可以限制往返db的次数。使用事务不会将所有查询放在一个批处理中。您可以使用
multi-criteria
Future
批量查询并提高性能。