Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC Fluent NHibernate更新记录,无需我显式调用Repository.Update(项)_C#_Asp.net Mvc_Nhibernate_Fluent Nhibernate_Fluent - Fatal编程技术网

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

C# ASP.NET MVC Fluent NHibernate更新记录,无需我显式调用Repository.Update(项),c#,asp.net-mvc,nhibernate,fluent-nhibernate,fluent,C#,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Fluent,我在ASP.NET MVC项目中设置了Fluent NHibernate。对于我的大多数记录,我需要显式调用Repository.Update(record),以便将记录实际持久化到数据库中 我在玩弄我的项目,我发现我的一个对象在不调用Update的情况下将其信息持久化到数据库中。我认为这是因为我后来在代码中调用了Update,但事实并非如此。在返回视图之前,我将对象中的一个字段更改了一行 我在更新时设置了一个断点(在返回视图之前的行上),但它从未到达那里。。。如果有区别的话,我确实在大约10行

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

我在玩弄我的项目,我发现我的一个对象在不调用Update的情况下将其信息持久化到数据库中。我认为这是因为我后来在代码中调用了Update,但事实并非如此。在返回视图之前,我将对象中的一个字段更改了一行

我在更新时设置了一个断点(在返回视图之前的行上),但它从未到达那里。。。如果有区别的话,我确实在大约10行之前显式地调用了Update

我知道这有点模糊,因为涉及到大量的配置和定制。我只是希望能朝着正确的方向或是去哪里看

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; 

这很可能是重复的:

从这个问答小

Hibernate维护已插入、更新或删除的对象的缓存。它还维护从数据库查询的对象的缓存。只要用于获取这些对象的EntityManager仍然处于活动状态,这些对象就称为持久对象。这意味着,当提交事务时,事务边界内对这些对象的任何更改都会自动持久化。这些更新在事务边界内是隐式的,您不必显式调用任何方法来持久化这些值

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

ISession将不时执行将ADO.NET连接的状态与内存中保存的对象的状态同步所需的SQL语句。默认情况下,此进程flush在以下几点进行

  • 从Find()或Enumerable()的某些调用

  • 来自NHibernate.ITransaction.Commit()的

  • 来自ISession.Flush()

SQL语句按以下顺序发出

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

  • 所有实体更新

  • 所有集合删除

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

  • 所有集合插入

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

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

除了显式Flush()之外,对于会话何时执行ADO.NET调用,绝对没有任何保证,只有执行顺序。但是,NHibernate确实保证ISession.Find(..)方法永远不会返回过时的数据;他们也不会返回错误的数据


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

非常感谢!现在,我知道了:D