【问题标题】:NHibernate Get() followed by Flush or Commit?NHibernate Get() 后跟 Flush 还是 Commit?
【发布时间】:2011-08-06 09:34:29
【问题描述】:

我的 ISession 对象的 FlushMode 是 Fl​​ushMode.Commit。

我使用此处定义的工作单元和存储库模式: http://nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx

我记得看到一些例子,有些人在调用 Get() 后立即执行 Flush 或事务提交。我们是他们刚刚摆脱困境,还是有理由这样做?

根据我的测试:

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

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

【问题讨论】:

    标签: nhibernate transactions unit-of-work flush


    【解决方案1】:

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

    Ayende 在他的帖子 NH Prof Alerts: Use of implicit transactions is discouraged 中更详细地解释了这一点。

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

    【讨论】:

    • 我想你的意思是......“而不是让RDBMS 隐式使用它们。”
    • @dotjoe 实际上,没有。也许我误解了这个概念,但我的印象是,如果我们不明确使用事务,NHibernate 将执行它自己的事务中的每条语句。这就是我写 NHibernate 隐式使用事务时的意思。
    • 如果您不在显式事务中,则 RDBMS 将在其自己的事务中执行每个单独的语句。我很确定 NH 不会为您创建它们...
    • dotjoe 是正确的(我相信)。 RDBMS 将所有内容包装在一个事务中。 NHibernate 只允许您指定什么类型的事务 - 已提交、未提交等 - 而且我相信它通过将查询分组到单个事务而不是多个事务来防止到 RDBMS 的往返
    • @Chris Klepeis 由您决定将往返限制为 db。使用事务不会将所有查询放在一批中。您可以使用MultiCriteriaFuture 来批量查询并提高性能。
    猜你喜欢
    • 2013-01-12
    • 2019-11-23
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多