使用EF仅更新特定字段时遇到问题
开发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字段。任何想法为什么会发生这种情况,或者我如何才能使其正常工作?
我认为这可能是您在附加对象之后将值赋给Id属性的结果。在附加之前分配Id可能会产生更好的结果,但我没有测试过。
无论如何,我会推荐一种不同的方法。如果我是你,我会做以下事情:
- 遍历列表。
- 使用密钥(大概是Id字段)从EF数据库获取对象
- 更新您感兴趣的两个字段。
- 保存循环完成时的更改。
我不知道你有多少条记录。由于性能方面的原因,这样做可能并不可行,但如果性能不是问题,那么我会推荐这样做。
谢谢。你能提供一个简单的例子吗? – WebDevGuy2
我把附件放下,放在我设置ID的地方,它起作用了!谢谢! – WebDevGuy2
我很高兴能够提供帮助。抱歉,我错过了你的第一个问题,忙碌的一天 – JuanR
我认为Id是外键,它被设置为自动增量,因此它会自动设置您不需要设置Id值的值。 – 2017-04-17 17:34:32