無法使用EFCore編輯數據庫條目,EntityState.Modified:“數據庫操作預計會影響1行,但實際上會影響0行。”

asp.net-core asp.net-identity c# entity-framework entity-framework-core

我正在使用Identity Core 1.0與ASP.NET MVC Core 1.0和Entity Framework Core 1.0創建一個簡單的用戶註冊系統,以本文為出發點,我正在嘗試添加用戶角色。我可以添加用戶角色,但我無法編輯它們。這是RolesControllerEdit操作:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Edit(IdentityRole role)
    {
        try
        {
            _db.Roles.Attach(role);
            _db.Entry(role).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return View();
        }
    }

以下是相應視圖中的表單:

@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@{
    ViewBag.Title = "Edit";
}

<h2>Edit Role</h2>
<hr />
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.Id)
    <div>Role name</div>
    <p>@Html.TextBoxFor(model => model.Name)</p>
    <input type="submit" value="Save" />
}

新的角色名稱不保存到數據庫,我得到以下異常: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.

我能夠使用這個確切的代碼(使用Microsoft.AspNet.Identity.EntityFramework依賴項而不是EntityFrameworkCore )來編輯使用EF 7,Identity 3等的數據庫條目。

有關為什麼此代碼不允許修改數據庫條目的任何想法?

熱門答案

除非隱藏的異常隱藏在此作為一個愚蠢的隨機異常,否則原因在異常中明確說明。

Edit操作上收到role像上的Id並嘗試在數據庫中查找該ID。您看到的異常消息指出,它期望找到一個與您附加的對象具有匹配ID的行,但它不是,因此無法進行更新,因為它無法找到匹配的行來更新它。

編輯:

您正在附加實體兩次,刪除對.Attach(role)的調用並保留在其下方的行,這足以將對象添加到處於修改狀態的跟踪上下文。

//_db.Roles.Attach(role); //REMOVE THIS LINE !.
_db.Entry(role).State = Microsoft.EntityFrameworkCore.EntityState.Modified;

請注意,將條目的狀態設置為modified將在調用.SaveChanges()時更新所有屬性值,因此,如果您只想更新某些屬性,請參閱此答案

如果這不能解決您的問題,請檢查您可能錯過的任何內部異常。有時,異常消息沒有意義,並掩蓋了您可能在內部異常中找到的真正問題。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow