3

如果实体属性在控制器操作中发生更改并且未调用 Update/SaveChanges,该实体会自动更新吗?

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

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

//etc.

在我的应用程序中,我有一个 ajax/ActionResult 调用,它从数据库中获取一个实体,执行一些基本计算,并返回一个 JSON 对象。长话短说,我在我的 ActionResult 中使用的静态助手中发现了一个错误,该错误正在更改我的实体上的属性值,而不是我返回的 JSON 模型。

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

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

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

这里也有一些很好的例子。

我认为鉴于我的实体已附加,我的问题的简短回答是“是”。但是对于 EF 来说有点新,我发现这是一个非常难以弄清楚的错误,因为它仍然似乎在幕后发生了一些我无法追踪的事情。我犹豫将其作为一个问题发布,但认为更有知识的人可以扩展我假设的“是”答案,并至少帮助遇到此问题的其他人。

4

1 回答 1

8

如果实体属性在控制器操作中发生更改并且未调用 Update/SaveChanges,该实体会自动更新吗?

不,ef 只会在 SaveChanges 调用上将您的更改传播到数据库。保存只能手动进行(即您必须显式调用 SaveChanges)。

What is really important to understand though is that SaveChanges saves all current modifications to the context. This means if you are sharing a context your changes will be saved when anyone (not just you) calls SaveChanges.

于 2012-06-18T22:33:33.653 回答