簡體   English   中英

對DbContext的更改未保存-MVC實體框架

[英]Changes to DbContext not saved - MVC Entity framework

我使用VisualStudio Exrpess 2013 for WEB創建了一個數據庫,然后創建了一個MVC解決方案,並且創建了一個ViewModel以顯示帶有下拉列表的Edit視圖。 視圖模型僅包括PartnerList類型的屬性“ parlists”(代表數據庫主表的模型),以及2個SelectList類型的屬性,我將使用這些屬性在視圖中創建下拉列表。 viewmodel的代碼如下:

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;”行中。 但這並不能真正解決問題。 我檢查了很多帖子,並嘗試了不同的解決方案,但是它們都沒有起作用,因此,我希望獲得一些幫助。

我懷疑您缺少上下文添加或更新。 這是我如何處理新記錄創建的示例。

對於更新,您將首先找到記錄,然后保存更改。

 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 Edit方法中,替換了以下行:

                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;

現在,執行SaveChages()之后,我的實體HoldingsFile和RealGainFile會更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM