【问题标题】:EF Update using EntityState.Modified使用 EntityState.Modified 进行 EF 更新
【发布时间】: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

【问题讨论】:

    标签: entity-framework


    【解决方案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 中非常有用,您只需将属性绑定到控件,而不必在后面编写代码来更新上下文

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

        【讨论】:

          猜你喜欢
          • 2011-12-02
          • 2019-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-11
          相关资源
          最近更新 更多