EFCore、EntityState.Modifiedを使用してデータベースエントリを編集できません: "データベース操作は1行に影響すると予想されましたが、実際には0行に影響します。"

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

質問

ASP.NET MVC Core 1.0とEntity Framework Core 1.0でアイデンティティコア1.0を使用しています。 この記事では単純なユーザー登録システムを作成し、ユーザーロールを追加しようとしています。ユーザーの役割を追加することはできますが、編集することはできません。 RolesController Editアクションは次のRolesControllerです。

    [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.

私はこの正確なコード( EntityFrameworkCoreではなくMicrosoft.AspNet.Identity.EntityFramework依存関係)を使用して、EF 7、Identity 3などを使用してデータベースエントリを編集することができました。

このコードがデータベースエントリを変更できない理由についての考えはありますか?

人気のある回答

暗黙の例外として隠れている隠れた例外がない限り、その理由は例外に明記されています。

Editアクションでroleオブジェクトを受け取ると、 roleオブジェクトのIdを確認し、そのIDをデータベースで参照しようとします。表示された例外メッセージには、添付したオブジェクトのIDが一致する行が見つかることが予想されますが、更新されていないため、一致する行が見つからないため更新できません。

編集:

エンティティを2回アタッチし、 .Attach(role)への呼び出しを削除し、オブジェクトを変更された状態のトラッキングコンテキストに追加するのに十分な行をその下に保持します。

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

変更するエントリの状態を設定すると、 .SaveChanges()を呼び出すときにすべてのプロパティ値が更新されるので、特定のプロパティのみを更新する場合は、 この回答を参照しください。

これで問題が解決しない場合は、逃してしまった可能性のある内部例外がないかどうかを確認してください。場合によっては、例外メッセージが意味をなさないので、内部の例外で見つかる可能性のある実際の問題を隠すことがあります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ