首页 > 解决方案 > Entity Framework Core SaveChangesAsync 不会将新记录更新到数据库

问题描述

在名为 的控制器Identities中,我有一些将新记录更新到数据库的操作,例如,这是编辑操作:

        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditPost(string? id, string[] selectedCourses)
        {
            if (id == null)
            {
                return NotFound();
            }

            var currentUser = await _db.AppUsers
                .FirstOrDefaultAsync(u => u.Id == id);

            if (currentUser == null)
            {
                return NotFound();
            }

            if (currentUser.UserType == "Student")
            {
                var studentToEdit = await _db.AppUsers
                    .Include(e => e.Enrollments)
                        .ThenInclude(c => c.Course)
                    .AsNoTracking()
                    .FirstOrDefaultAsync(u => u.Id == id);

                if (await TryUpdateModelAsync(studentToEdit, "",
                    u => u.UserName, u => u.FirstName, u => u.LastName, u => u.Email,
                     u => u.PhoneNumber, u => u.UserType, u => u.DepartmentID))
                {
                    try
                    {
                        // this is for debugging purpose 
                        Console.WriteLine(studentToEdit);
                        // save changes to db
                        await _db.SaveChangesAsync();
                    }
                    catch (DbUpdateException)
                    {
                        // Log the error (uncomment ex variable name and write a log.)
                        ModelState.AddModelError("", "Unable to save changes. " +
                            "Try again, and if the problem persists, " +
                            "see your system administrator.");
                    }

                    return RedirectToAction(nameof(Index));
                }
            }
            else
            {
                var lecturerToEdit = await _db.AppUsers
                    .Include(ca => ca.CourseAssignments)
                        .ThenInclude(c => c.Course)
                    .AsNoTracking()
                    .FirstOrDefaultAsync(u => u.Id == id);

                if (await TryUpdateModelAsync(lecturerToEdit, "",
                 u => u.UserName, u => u.FirstName, u => u.LastName, u => u.Email,
                 u => u.PhoneNumber, u => u.UserType, u => u.DepartmentID))
                {
                    try
                    {
                        Console.WriteLine(lecturerToEdit);
                        await _db.SaveChangesAsync();
                    }
                    catch (DbUpdateException)
                    {
                        //Log the error (uncomment ex variable name and write a log.)
                        ModelState.AddModelError("", "Unable to save changes. " +
                            "Try again, and if the problem persists, " +
                            "see your system administrator.");
                    }

                    return RedirectToAction(nameof(Index));
                }
            }

            return View(currentUser);
        }

这是视图:

<div class="container">
    <form method="post" asp-controller="Identities" asp-action="Edit">
        <div class="row px-2 border p-4 text-center">
            <div class="text-danger" asp-validation-summary=ModelOnly></div>
            <div class="col-8">
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="UserName"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="UserName" class="form-control">
                        <span asp-validation-for="UserName" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="FirstName"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="FirstName" class="form-control">
                        <span asp-validation-for="FirstName" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="LastName"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="LastName" class="form-control">
                        <span asp-validation-for="LastName" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="Email"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="Email" class="form-control">
                        <span asp-validation-for="Email" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="PhoneNumber"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="PhoneNumber" class="form-control">
                        <span asp-validation-for="PhoneNumber" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="UserType"></label>
                    </div>
                    <div class="col-8">
                        <input asp-for="UserType" class="form-control">
                        <span asp-validation-for="UserType" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <label asp-for="Department" class="control-label">Department</label>
                    </div>
                    <div class="col-8">
                        <select class="form-control" asp-for="DepartmentID" asp-items="ViewBag.DepartmentList">
                            <option value="">-- Select Department --</option>
                        </select>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-8 offset-4">
                        <div class="row">
                          <div class="col">
                                <button type="submit" class="btn btn-primary form-control">Update</button>
                            </div>
                            <div class="col">
                                <a asp-action="Index" class="btn btn-success form-control">Back To List</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
    </form>
</div>

My problem: 当我尝试更新新记录并将更改保存到数据库时,新记录没有更新。

My trials:我已经调试并设置断点来跟踪我在每个输入字段中插入的新记录是否正常。令人惊讶的是一切都很好。如我所料,在其中一个Console.Writeline(studentToEdit)Console.Writeline(lecturerToEdit)包含新的记录数据。但是在我尝试的最后一步saveChangesAsync中,新记录根本没有保存到数据库中。

标签: c#asp.net-coreentity-framework-core

解决方案


正如它的定义所AsNoTracking()指出的那样read-only,但我将它插入到查询中,Edit post以便它无法更新新记录到数据库中。删除AsNoTracking(),它工作。


推荐阅读