对DbContext的更改未保存-MVC实体框架
本文关键字:保存 -MVC 实体 框架 DbContext | 更新日期: 2023-09-27 18:24:44
我已经创建了一个数据库,然后使用Visual Studio Exrpess 2013 for WEB和我创建了一个ViewModel来显示带有下拉列表的"编辑"视图。视图模型只包括PartnerList类型的属性"parlists",它是表示数据库主表的模型,以及SelectList类型的2个属性,我用它来创建视图中的下拉列表。视图模型的代码如下:
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);
}
此代码运行良好,视图正确地显示了带有下拉列表的表单。我省略了视图代码,因为它很长,而且可能不相关。到目前为止还不错。但是,我的HttpPostEdit方法并没有保存对数据库的更改。代码如下:
[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视图,而不将更改保存到数据库。我试着按照一些帖子中的建议使用Attach,但我相信附加步骤已经包含在"db.Entry(newParList.Parrlists).State=EntityState.Modified;"行中但这并没有真正解决问题。我检查了很多帖子,尝试了不同的解决方案,但都不起作用,所以我很感激你的帮助。
我怀疑您缺少上下文添加或更新。下面是一个我如何处理创建新记录的示例。
对于更新,您将首先找到记录,然后保存更改。
public void SaveCreatedMessage(Message message)
{
var dbEntry = _context.Message.Add(message);
if (dbEntry != null)
{
// Create the new record
dbEntry.CustomerID = message.CustomerID;
dbEntry.MessageID = message.MessageID;
dbEntry.Description = message.Description;
dbEntry.Text = message.Text;
dbEntry.IsRead = message.IsRead;
dbEntry.CreatedOn = message.CreatedOn;
dbEntry.CreatedBy = message.CreatedBy;
_context.Message.Add(message);
}
_context.SaveChanges();
}
我想我找到了解决方案。我没有更新正确的实体。在我的HttpPost编辑方法中,我现在替换了以下行:
db.Entry(newParList.parlists).State = EntityState.Modified;
带有:
db.Entry(newParList.parlists.AssetDataSource.HoldingsFile).State = EntityState.Modified;
db.Entry(newParList.parlists.AssetDataSource.RealGainFile).State = EntityState.Modified;
现在,我的实体HoldingsFile和RealGainFile在执行SaveChages()后更新。