我创建了一个数据库,然后使用VisualStudio Exrpess 2013用于WEB,并创建了一个MVC解决方案,并创建了一个ViewModel以显示带有下拉列表的编辑视图。 视图模型只包含PartnerList类型的属性'parlists',它是代表数据库主表的模型,以及2个用于在视图中创建下拉列表的SelectList类型属性。 的视图模型的代码如下:对DbContext的更改未保存 - MVC实体框架
public class FileStatusEdit
{
public SelectList HoldingsStatus { get; set; }
public SelectList RealGainStatus { get; set; }
public PartnerList parlists { get; set; }
}
在控制器我对HTTPGET编辑方法以下代码:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var viewModel = new FileStatusEdit
{
HoldingsStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.HoldingsFile.Status_ID),
RealGainStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.RealGainFile.Status_ID),
parlists = db.PartnerLists
.Include(p => p.AssetDataSource)
.Where(p => p.IntermediaryID == id)
.Single()
};
if (viewModel.parlists == null)
{
return HttpNotFound();
}
return View(viewModel);
}
此代码工作正常和视图被正确地显示形式与下拉列表。我忽略了视图代码,因为它很长,并且显然不相关。 目前为止这么好。 但是,我的Http Post编辑方法没有将更改保存到数据库。代码如下:
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(FileStatusEdit newParList)
{
if (TryUpdateModel(newParList.parlists, "",
new string[] { "Firstname", "Surname", "Category", "ClientID", "IntermediaryID", "ExternalRef", "RecordStatus", "Asset_Data_Source_ID", "New_Communication_Issued", "AssetDataSource", "HoldingsFile", "RealGainFile"}))
{
try
{
db.Entry(newParList.parlists).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
catch (RetryLimitExceededException)
{
ModelState.AddModelError("", "Unable to save changes.");
}
}
return View(newParList);
}
正如你可以看到我传递的视图模型(newParList)到EditPost方法,然后我用TryUpdateModel更新。通过进入调试过程,我可以看到数据库记录newParList.parlists正确更新了用户输入,但是当执行db.SaveChanges()步时,程序将重定向到Index视图而不保存对数据库的更改。 我试着使用附加建议在一些职位,但我相信附加步骤已经包含在行'db.Entry(newParList.parlists).State = EntityState.Modified;'这并没有确实解决问题。 我检查了很多帖子,并尝试了不同的解决方案,但他们都没有工作,所以我希望得到一些帮助。
谢谢你的建议。我找到了解决方案,并将其发布为我的问题的答案。 – UbuntuDude 2014-09-27 09:58:31
我刚刚发现,如果你创建了一个不完整的记录,即丢失了外键,而不是抛出一个验证错误,它只是跳过保存的记录,所以当一切看起来成功时,没有任何东西被保存 – MikeT 2016-06-28 10:30:21