我知道使用ObjectStateManager只会导致1次访问数据库,但是更大的更新语句和ApplyCurrentValues导致2次访问数据库,1次访问实体,1次更新实体,因此有什么优缺点每个也发出以下声明如何知道我想要更新当前记录,我知道它与将其加载到上下文中有关,但不确定它是如何工作的。
[HttpPost]
public ActionResult Edit(Movie movie)
{
(from m in _db.Movies1
where m.Id == movie.id
select m).First()
//How does calling the above query know to update the movie,
can't I do it with out it?
_db.Movies1.ApplyCurrentValues(movie);
_db.SaveChanges();
}
答案 0 :(得分:0)
您发布的代码“知道”您要更新记录,因为它假定状态是否已修改(applycurrentvalues将属性标记为已修改),那么您必须要更新该字段。
所以修改了所有内容,然后发送到数据库。但是,其中包含.First()的代码在这里没有任何帮助。
ApplyCurrentValues不会加载任何内容,因此您的第一行代码会将其加载到上下文中。然后ApplyCurrentValues将值合并到其中。任何不同的东西都被标记为已修改并复制,然后这些字段才会被发送到db进行更新。
您可以对活动进行分析,然后结帐 http://msdn.microsoft.com/en-us/magazine/gg490349.aspx
还有一个很好的demp profiler另一种选择是简单地附加修改并保存更改。我认为这只会产生一个查询(对数据库的更新),我将不得不仔细检查。 该代码看起来像:
_db.Entry(movie).State = EntityState.Modified; //attaches is as well _db.SaveChanges();
这将保存每个属性,但我认为它可能少一次(更新,重新加载,而不是加载,更新,重新加载)