0

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

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

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

4

2 回答 2

3

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

于 2010-07-19T13:27:00.883 回答
1

根据Auto 默认 FlushMode的文档:

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 的目的,并将其降级为一个简单的数据访问工具。

于 2010-07-19T13:51:38.363 回答