2017-04-17 70 views
0

开发MVC 5应用程序。使用EF仅更新特定字段时遇到问题

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

这里的视图模型....

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 statment(用于SurveyAnswer场)。错误是...

属性'Id'是对象的关键信息的一部分,无法修改。

我不想更新Id字段。任何想法为什么会发生这种情况,或者我如何才能使其正常工作?

+0

我认为Id是外键,它被设置为自动增量,因此它会自动设置您不需要设置Id值的值。 – 2017-04-17 17:34:32

回答

2

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

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

  • 遍历列表。
  • 使用密钥(大概是Id字段)从EF数据库获取对象
  • 更新您感兴趣的两个字段。
  • 保存循环完成时的更改。

我不知道你有多少条记录。由于性能方面的原因,这样做可能并不可行,但如果性能不是问题,那么我会推荐这样做。

+0

谢谢。你能提供一个简单的例子吗? – WebDevGuy2

+0

我把附件放下,放在我设置ID的地方,它起作用了!谢谢! – WebDevGuy2

+0

我很高兴能够提供帮助。抱歉,我错过了你的第一个问题,忙碌的一天 – JuanR