c# - 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
中,新记录根本没有保存到数据库中。
解决方案
正如它的定义所AsNoTracking()
指出的那样read-only
,但我将它插入到查询中,Edit post
以便它无法更新新记录到数据库中。删除AsNoTracking()
,它工作。
推荐阅读
- python - Python Windows 服务 - traceback.print_exception() 失败
- javascript - USB绑定配置的电子问题?
- javascript - Firebase 实时数据库分页
- mongodb - MongoDb _id 字段重命名
- swift - 如何在已经开发的项目中使用 spritekit 实现小游戏
- c# - 生成具有特定格式的所有排列
- python - Python 中的 Redshift 连接单元测试
- reactjs - 在reactjs中随机改组对象/数组
- sql - 在 PostgreSQL 上查询分区表
- java - 带有 -agentlib:jdwp 的 spark-submit 不会暂停