【问题标题】:Is Context.SaveChanges called automatically when an entity that is being tracked changes?当被跟踪的实体发生变化时,是否会自动调用 Context.SaveChanges?
【发布时间】:2012-06-18 22:21:01
【问题描述】:

如果实体属性在控制器操作中发生更改并且未调用 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 被退回。

here 也有一些很好的例子。

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

【问题讨论】:

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


    【解决方案1】:

    如果实体属性在控制器动作中发生了变化,并且 不调用 Update/SaveChanges,是否会更新该实体 自动?

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

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

    【讨论】:

    • 现在我明白了!我没有在我修改的实体上调用 Update/SaveChanges,但我确实在同一个控制器操作中调用了 Insert/SaveChanges 到新的日志实体。非常感谢卢克。这很有帮助。
    • @nameEqualsPNamePrubeGoldberg 没问题,很高兴为您提供帮助。保存更改的副作用是一个相当普遍的问题。我通常通过依赖注入和绑定上下文 InRequestScope 来解决这个问题。您还可以通过在查询时分离实体并在保存时重新附加它们来解决存储库的这个问题(但这确实会引入更多复杂性)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多