ASP.NET MVC Fluent NHibernate更新记录,而无需我显式调用Repository.Update(



我在 ASP.NET MVC项目中设置了Fluent NHibernate。对于我的大多数记录,我需要显式调用 Repository.Update(record( 以使记录实际持久化到数据库中。

我正在

玩我的项目,我发现我的一个对象正在将其信息保存到数据库中,而没有调用 Update。我以为这是因为我稍后在代码中调用了 Update,但事实并非如此。在返回视图之前,我将对象中的一个字段更改了一行。

我在更新处设置了一个断点(在返回视图之前的行(,但它从未去过那里......如果它有所作为,我之前确实明确调用了大约 10 行的更新。

我知道这有点模糊,因为涉及大量的配置和自定义。我只是希望朝着正确的方向或寻找方向。

Player myPlayer = this.PlayerRepository.GetById(id); 
myPlayer.Location = "USA"; 
myPlayer.Age = 19;
this.PlayerRepository.Update(myPlayer);
...
...
...
myPlayer.Name = "John";   //this is being persisted without me actually calling Update
return View; 

很可能是重复的:

  • NHibernate ISession.Update

此问答中的小引用

Hibernate维护已插入,更新或删除的对象缓存。它还维护已从数据库查询的对象缓存。只要用于获取它们的实体管理器仍处于活动状态,这些对象就称为持久对象。这意味着在提交事务时,事务范围内对这些对象的任何更改都会自动保留。这些更新隐式存储在事务边界内,无需显式调用任何方法来保留值。

简单地说,你所经历的,是一种标准的、正确的行为。这就是ORM工具通常的工作方式。尝试阅读:

9.6. 冲洗

ISession 会不时执行将 ADO.NET 连接的状态与内存中保存的对象的状态同步所需的 SQL 语句。此过程(刷新(默认在以下点发生

  • 来自 Find(( 或 Enumerable(( 的一些调用

  • 来自NHibernate.ITransaction.Commit((

  • 来自 ISession.Flush((

SQL 语句按以下顺序发出

  • 所有实体插入,使用ISession.Save((保存相应对象的顺序相同

  • 所有实体更新

  • 所有集合删除

  • 所有集合元素的删除、更新和插入

  • 所有集合插入

  • 所有实体删除,使用ISession.Delete((删除相应对象的顺序相同

(例外情况是,使用本机 ID 生成的对象在保存时会插入。

除非显式 Flush((,否则绝对不能保证会话何时执行 ADO.NET 调用,只能保证执行它们的顺序。但是,NHibernate确实保证ISession.Find(..(方法永远不会返回过时的数据;他们也不会返回错误的数据。

从这几行应该可以清楚地看出,NHibernate:...ISession 会不时执行将 ADO.NET 连接的状态与内存中保存的对象的状态同步所需的 SQL 语句......

最新更新