使用 EntityState.Modified 进行 EF 更新

Posted

技术标签:

【中文标题】使用 EntityState.Modified 进行 EF 更新【英文标题】:EF Update using EntityState.Modified 【发布时间】:2015-07-26 22:36:50 【问题描述】:

我通常使用这个代码

Member member = ctx.Members.Find(id);
member.Name = txtName.Text;
ctx.Entry(member).State = EntityState.Modified;
ctx.SaveChanges();

当我想使用实体框架更新模型时。我在SO 上找到了一个不使用EntityState.Modified 更新模型的示例。我尝试删除该行,但它仍在工作。使用EntityState.Modified和不使用EntityState.Modified的优缺点是什么?

注意:我在 WinForms 中使用 Entity Framework 6 Code First

【问题讨论】:

【参考方案1】:

EntityState.Modified 在您的情况下是无用的,因为您正在更新的实体在您从上下文中检索它时已经被上下文跟踪。

在以下不从上下文中检索实体的情况下,您将需要它:

Member member = new Member(Id=1, Name="member") ;
context.Entry(member).State = EntityState.Modified; 
context.SaveChanges();

此外,如上一个答案中所述,您的上下文有时仅跟踪数据库的有限“视图”,因此您需要像上面一样手动启动跟踪。

Microsoft doc

【讨论】:

【参考方案2】:

就像其他人提到的那样,您的上下文会自动跟踪对象的更改。

我发现它更有用,例如当我使用将 json 返回到 mvc 控制器时,原始对象在第一次转换为视图的 json 时会丢失更改跟踪。在这种情况下,我必须在保存更改之前专门设置对象实体状态。

【讨论】:

【参考方案3】:

如果您使用更改跟踪,那么代理对象会侦听属性更改并自动更新上下文,这在 mvvm 中非常有用,您只需将属性绑定到控件,而不必在后面编写代码来更新上下文

如果您不使用更改跟踪(例如,当您处理大量实体时),您必须自己更新上下文

【讨论】:

以上是关于使用 EntityState.Modified 进行 EF 更新的主要内容,如果未能解决你的问题,请参考以下文章

EF 6.0 - 更新与 EntityState.Modified 的关系

直接使用提交过来的类来更新字段EntityState.Modified并过滤null值的方法

实体框架:新对象的状态值

覆盖 SaveChanges 并删除 EF 关系时为 null

DBContext.Entry 有啥作用?

无法更新EF6中的实体?