【问题标题】:NHibernate FlushMode: How do I set up NHibernate for automatically updating an entityNHibernate FlushMode:如何设置 NHibernate 以自动更新实体
【发布时间】:2011-03-17 22:03:45
【问题描述】:

检索实体后,我更改它的属性。 然后我检索相同的实体。

Nhibernate 怎么说,它应该在加载实体之前更新实体?

代码如下:

EmployeeRepository employeeRepository = new EmployeeRepository();
Employee employee = employeeRepository.GetById(4);
employee.LastName = "TEST!!!";
Employee employee2 = employeeRepository.GetById(4);

目前 Nhibernate 不会在我的程序中进行更新。我以为只是将 FlushMode 设置为 Auto 会自动更新实体。

编辑 背景是我试图在另一个应用程序中重现这种行为。 没有保存方法!就这一段代码。 NHibernate 版本真的很旧,它是 1.2.1.4000 版本。也许有问题。

当我在棕地应用程序中将 FlushMode 设置为 Commit 时,不会生成更新语句。

但在我自己的项目中,我仍然无法重现这种“自动”行为。

【问题讨论】:

    标签: nhibernate flush


    【解决方案1】:

    根据the documentation的默认FlushMode为Auto:

    ISession 有时会被刷新 在查询执行之前,以便 确保查询永远不会返回陈旧 状态。这是默认的刷新模式。

    因此您必须手动刷新会话以确保在再次读取对象之前保留您的更改。

    EmployeeRepository employeeRepository = new EmployeeRepository();
    Employee employee = employeeRepository.GetById(4);
    employee.LastName = "TEST!!!";
    session.Flush();
    Employee employee2 = employeeRepository.GetById(4);
    

    如果您的存储库对两次调用都使用相同的 ISession(就像 imo 一样),则将从缓存中检索员工 4 并进行更改。但是,更改尚未持久化到数据库中。

    如果您的存储库 GetById 方法为每个调用使用一个新会话,那么它将始终访问数据库以检索员工。如果您在方法中处理会话,那么您的对象将作为与会话分离的对象返回。这种策略违背了 NHibernate 的目的,并将其降级为一个简单的数据访问工具。

    【讨论】:

    • "ISession 有时会被刷新" 有时是什么意思 :D?那么,当 Nhibernate 调用更新 sql 语句时呢?我没有正确理解这一点。
    • 我不确定。我的期望是,如果您检索并更改了员工,然后在表上进行了选择,NHibernate 将首先刷新会话,以便查询返回一致的结果。这只有在同一会话中完成操作时才有效。通过主键获取对象是另一回事;在这种情况下,NHibernate 将从缓存中检索它。
    • 我现在通过 ICriteria API 通过实现 GetByName 方法来检索实体,但仍然没有更新语句。我有相同的会话,FlushMode = auto。我做错了什么?
    • 你没有做错任何事。这是预期和记录的行为。您必须刷新会话才能将更改持久保存到数据库。
    • 但在我的棕地应用程序中,我不必手动刷新会话。创建了一个神奇的更新语句,我无法重现。
    【解决方案2】:

    对employeeRepository 的调用是否最终都使用相同的NHibernate ISession 实例?如果是这样,那么它们将返回相同的对象,并且将反映更新的LastName 值。如果没有,那么您需要确保每次都处理您的 ISession 实例以利用自动刷新。

    【讨论】:

    • 所以当我使用相同的“ISeesions”时,NHibernate 会自动调用更新 sql 语句,因为我将 FlushMode 设置为 auto?
    • 不,它会将更改的对象缓存在内存中。
    • 我使用了 Visual Studio 中的调试器(“make object id”,即 #1)来测试存储库是否使用相同的 ISession,并且它们确实使用了相同的 ISession。但是 NHibernate 会生成一条更新语句。我无法理解。
    • 在我自己的解决方案中,它按照您的描述工作。首先没有创建第二个选择语句,并且 NHibernate 也没有创​​建更新语句。但在另一个棕地应用程序中,仍然会生成并执行更新和选择语句。
    • 无论您使用 Get、Load 还是 ICriteriAPI,都会使用值反射,很酷的东西;) 所有 3 种技术都不会生成更新语句:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多