【问题标题】:Entity framework attach update not working实体框架附加更新不起作用
【发布时间】:2011-06-11 07:44:49
【问题描述】:

我正在尝试通过以下方式使用实体框架更新 POCO 对象:

 context.Jobs.Attach(job);
 context.SaveChanges();

那行不通。没有抛出错误,只是没有更新数据库中的值。

我试过了:

context.Jobs.AttachTo("Jobs", job);
context.SaveChanges();

没有错误,仍然没有错误,也没有更新。

【问题讨论】:

    标签: entity-framework poco


    【解决方案1】:

    如何更改ObjectState

    context.ObjectStateManager.ChangeObjectState(job, System.Data.EntityState.Modified);
    

    来自 MSDN:ObjectStateManager.ChangeObjectState Method

    【讨论】:

    • 本着保持这个答案最新的精神,EF6 的 context.Entry(job).State = System.Data.Entity.EntityState.Modified
    • EF 的 API 就像跟砖墙说话。
    【解决方案2】:

    我猜你正在使用分离的对象 - 检查 this answer 的第二部分。

    【讨论】:

      【解决方案3】:

      你必须先得到这份工作,然后你才能成功更新它,chk低于sn-p

        var job = context.Jobs.Where(p => p.Id == id).FirstOrDefault();
      //apply your changes
      job.Title = "XXXX";
      ///....
      context.SaveChanges();
      

      【讨论】:

      • var job = context.Jobs.SingleOrDefault(p => p.Id == id);
      【解决方案4】:

      这可能不起作用的另一个原因是相应的 Jobs.cs 文件已提交但 .edmx 文件未提交。这意味着该属性存在但未映射,因此 EF 不认为对象已修改。例如:

      ...
      using (var dao = new DbContext())
      {
          dao.Jobs.Attach(job);
          job.SomeProperty = 1234; // SomeProperty exists but is not in the .edmx
          dao.SaveChanges();
      }
      

      如果 Jobs.cs 中存在 SomeProperty,但 .edmx 文件中缺少 SomeProperty,则此代码将编译并执行,不会提示任何错误,但 SomeProperty 不会在数据库中更新。我花了一天时间找到这个。

      【讨论】:

        【解决方案5】:

        我的问题是我在更新对象后附加,实际上,您必须在更新任何属性之前附加

        context.Table.Attach(object);
        object.MyProperty = "new value";
        context.Table.SaveChanges();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多