NHibernate FlushMode:如何设置NHibernate来自动更新实体

时间:2010-07-19 13:20:53

标签: nhibernate flush

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

我怎么说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时,不会生成更新语句。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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的目的,并将其降级为简单的数据访问工具。