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

tre*_*orc 2 entity-framework asp.net-mvc-3

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

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

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

//etc.
Run Code Online (Sandbox Code Playgroud)

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

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

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

查找具有给定主键值的实体.如果上下文中存在具有给定主键值的实体,则会立即返回该实体而不向商店发出请求.否则,向具有给定主键值的实体的商店发出请求,并且如果找到该实体,则将该实体附加到上下文并返回.如果在上下文或存储中找不到实体,则返回null.

有一些真正的好例子在这里为好.

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

Not*_*ple 6

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

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

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