检索实体后,我更改了它的属性。 然后我检索相同的实体。
我怎么说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时,不会生成更新语句。
但在我自己的项目中,我仍然无法重现这种“自动”行为。
答案 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的目的,并将其降级为简单的数据访问工具。