如果控制器操作中的实体属性已更改且未调用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的假设答案,并且至少可以帮助其他人遇到这个问题。
答案 0 :(得分:6)
如果实体属性在控制器操作中已更改,并且 不会调用Update / SaveChanges,是否会更新该实体 自动?
不,ef只会在SaveChanges调用中将您的更改传播到数据库。保存仅手动发生(IE必须显式调用SaveChanges)。
要理解的是,SaveChanges将所有当前修改保存到上下文中。这意味着如果您正在共享上下文,则当任何人(不仅仅是您)调用SaveChanges时,您的更改将被保存。