【发布时间】: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