首页 > 解决方案 > 已检索数据但未保存或更新 ASP.NET Core 3.1

问题描述

我的问题与这个问题类似,但我已经应用了答案,但它仍然无法正常工作,并且我在将数据存储在数据库中时使用了稍微不同的方法。

员工模型班

    public class Employee
    {
        [Key]
        public int EmployeeId { get; set; }

        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
}

键入与保存相关的脚本代码

private urlSaveEmployee = '/employee/save';

private save() {
        try {

            const employee = this.createEmployee();
            Util.request(this.urlSaveEmployee, 'post', 'json', (response) => {
                if (response != null) {
                    $.notify(response.message);
                    location.reload();
                } else {
                    $.notify(response.message);
                    console.error('Failed to get data #T7G985. Please try again.');
                }
            }, () => {
            }, employee);
        } catch (e) {
            console.error(e);
        }
    }

    private createEmployee() {
        try {

            const employee = {
                EmployeeId: $('#employee_id').val(),
                Firstname: $('#first_name').val(),
                Lastname: $('#last_name').val()
            };
            return employee;
        } catch (e) {
            console.error(e);
        }
    }

保存按钮 查看代码

<tr>
                <td style="width: 100px">First Name*</td>
                <td>
                    <input type="hidden" id="employee_id" value="@Employee.EmployeeId" />
                    <input class="form-control-sm w-100" id="first_name" value="@Employee.FirstName" autocomplete="off" />
                </td>
            </tr>
            <tr>
                <td style="width: 100px">Last Name*</td>
                <td>
                    <input class="form-control-sm w-100" id="last_name" value="@Employee.LastName" autocomplete="off" />
                </td>
            </tr>


<button type="button" class="btn btn-sm btn-outline-primary employee-form-save" id="save_form">
                        <i class="fa fa-floppy-o" style="margin-right:5px"></i>
                        Save
                    </button>

保存相关的控制器代码

        [HttpPost("employee/save")]
        public async Task<IActionResult> SaveEmployee(Employee employee) {
            try
            {
                Employee employeeFromDb = await _db.Employees.FirstOrDefaultAsync(e => e.EmployeeId == employee.EmployeeId);

                if (employeeFromDb == null)
                {
                    _db.Employees.Add(employee);
                    _db.SaveChanges();
                    return Json(new { success = true, message = "Saved Successfully" });
                } else {
                    _db.Employees.Update(employee);
                    _db.SaveChanges();
                    return Json(new { success = true, message = "Updated Successfully" });
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Json(new { success = false, message = "Error while saving" });
            }
        }

当我单击保存按钮时,它会重新加载页面而不做任何更改。我添加了断点,据此employeeFromDb显然在.Update子句中,但它只是刷新页面并且数据库保持不变。这是该断点处的屏幕截图: 在此处输入图像描述

标签: c#sqlasp.net-mvctypescriptasp.net-core

解决方案


很高兴它起作用了,所以这只是一个测试。您对 EntityState 的发现确实是您应该从本教程中阅读的内容 - https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/crud?view=aspnetcore-3.1

实体状态 数据库上下文跟踪内存中的实体是否与其在数据库中的相应行同步,并且此信息确定调用 SaveChanges 方法时会发生什么。例如,当您将新实体传递给 Add 方法时,该实体的状态设置为已添加。然后,当您调用 SaveChanges 方法时,数据库上下文会发出一个 SQL INSERT 命令。

如果您查看 Edit 示例,其中 Bind 属性与记录的参数 Id 一起传递,您可能会将其用作您工作的更好示例。但是,如果您想创建一个映射器类来将您的请求对象转换为实体框架对象,以便正确更新它也可以工作。我想知道您之前是否真的遇到过异常但由于断点不在该块上而错过了它。

如果通过 Ajax json 调用绑定,这也很有用 - https://stackoverflow.com/a/60180783/8161471


推荐阅读