当被跟踪的实体发生变化时,是否会自动调用Context.SaveChanges?

时间:2012-06-18 22:21:02

标签: asp.net-mvc-3 entity-framework

如果控制器操作中的实体属性已更改且未调用Update / SaveChanges,该实体是否会自动更新?

我正在使用带有存储库模式的EF 4.1。我在我的EfRepository类中处理所有CRUD操作,如下所示:

public void Update(T entity)
{
  try{_context.SaveChanges();}
  catch{//do stuff}
}

//etc.

在我的应用程序中,我有一个ajax / ActionResult调用,它从db获取实体,执行一些基本计算,并返回一个JSON对象。总而言之,我发现我在ActionResult中使用的静态帮助程序中的一个错误,它正在更改我的实体上的属性值而不是我返回的JSON模型。

我的操作方法没有更新方法,但每次调用此操作时我的实体都会更新。使用Sql Profiler我确认了一个更新语句,该语句是为了更新我的实体和我的错误静态方法正在改变的one(1)属性而定制的。

我在我的存储库类的Update方法中放置了一个断点,即使我的实体正在由EF更新,我也从未调用过MY Update方法。 IDbSet中接口方法'Find'(我使用的)的摘要说明了,

  

查找具有给定主键值的实体。如果是实体   给定的主键值存在于上下文中,然后是   在没有向商店提出要求的情况下立即返回。除此以外,   向具有给定主要实体的实体的商店发出请求   键值和此实体(如果找到)附加到上下文和   回。如果在上下文或商店中找不到实体,则为null   归还。

还有一些非常好的例子here

我认为鉴于我的实体已经附上,我的问题的简短回答是“是”。但是对于EF来说有点新,我发现这是一个非常难以弄清楚的错误,因为它仍然会出现一些我无法追踪的事情。我在将这个问题作为一个问题犹豫不决,但认为有更多知识渊博的人可以扩展我对YES的假设答案,并且至少可以帮助其他人遇到这个问题。

1 个答案:

答案 0 :(得分:6)

  

如果实体属性在控制器操作中已更改,并且   不会调用Update / SaveChanges,是否会更新该实体   自动?

不,ef只会在SaveChanges调用中将您的更改传播到数据库。保存仅手动发生(IE必须显式调用SaveChanges)。

要理解的是,SaveChanges将所有当前修改保存到上下文中。这意味着如果您正在共享上下文,则当任何人(不仅仅是您)调用SaveChanges时,您的更改将被保存。