使用 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值的方法