无法使用EF仅更新特定字段

时间:2017-04-17 17:26:26

标签: c# asp.net-mvc entity-framework

开发MVC 5应用程序。

查看:我有一个可编辑的表格。我只想更新已更改的行。另外,我只想更新2个字段,而不是所有字段。

这里是viewmodel ....

namespace SurveyingApp.ViewModels
{
  [NotMapped]
  public class SurveyResultsViewModel
  {
    // ------ hidden
    public int EventId { get; set; }

    [Display(Name = "Question")]
    public string SurveyQuestionText { get; set; }

    [Key]
    public int Id { get; set; } // SurveyResults.Id
    [Display(Name = "Answer")]
    public string SelectedSurveyAnswer { get; set; }

    public string Comments { get; set; }
  }
}

这是更新/发布代码...

  [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(
  [Bind(Include = "Id,SelectedSurveyAnswer,Comments")]
      List<SurveyResultsViewModel> mySurveyResult)
{
  if (ModelState.IsValid)
  {      
    for (int i = 0; i < mySurveyResult.Count() - 1; i++)
    {

      SurveyResult surveyResult = new SurveyResult();
      //Attach the instance so that we don't need to load it from the DB
      db.SurveyResults.Attach(surveyResult);

      //Set the Id for my model.
      surveyResult.Id = mySurveyResult[i].Id;
      //update field from the VM
      surveyResult.SurveyAnswer = mySurveyResult[i].SelectedSurveyAnswer;
      surveyResult.Comments = mySurveyResult[i].Comments;

      //Specify fields that should be updated.
      db.Entry(surveyResult).Property(x => x.SurveyAnswer).IsModified = true;
      db.Entry(surveyResult).Property(x => x.Comments).IsModified = true;

      db.SaveChanges();
      return RedirectToAction("Index");
   }
   db.SaveChanges();
   return RedirectToAction("Index");
 }
 return View();
}

直到第一个.IsModified语句(对于SurveyAnswer字段)才有效。错误是......

  

该物业&#39; Id&#39;是对象的关键信息的一部分,不能修改。

我没有尝试更新Id字段。知道为什么会这样,或者我怎么能让它正常工作?

1 个答案:

答案 0 :(得分:2)

我认为这可能是您在附加对象后为Id属性赋值的结果。在附加之前分配Id可能会产生更好的结果,但我没有对此进行测试。

无论如何,我会推荐一种不同的方法。如果我是你,我会做以下事情:

  • 循环浏览列表。
  • 使用密钥(可能是Id字段)
  • 从EF获取数据库中的对象
  • 更新您感兴趣的两个字段。
  • 循环完成后保存更改。

我不知道你有多少记录。出于性能原因这样做可能是不可行的,但如果性能不是问题,我会建议这样做。