更新未找到的实体记录

问题描述 投票:0回答:1

我很难理解为什么我的实体状态没有更新。目标是更新客户详细信息。到目前为止,我所做的是建立一个表单,在输入中填充客户端数据以进行更改。一旦字段被更改并且用户点击提交,它应该点击 HTTP post 并将更改实体处理到数据库,但是,我收到此错误,但我知道记录存在并且 UpdateDetails 页面正在使用正确的输入填充数据。我注意到的是,在调试时,当客户端 ID 到达 HTTP post 时会传递 0。为什么会发生这种情况?我不知道。我确实有一个产品的工作方法,它本质上与客户端执行相同的过程,但存在产品 ID。我在这里忽略了什么?

使用的技术是 ASP.NET 8 MVC

DbUpdateConcurrencyException:数据库操作预计影响1行,但实际影响0行;自加载实体以来,数据可能已被修改或删除。 }

更新客户端.cs


<div class="row">
    <form asp-action="UpdateClient" asp-controller="Admin" method="post">
        <div class="row">
            <div class="col-4 mb-3">
                <label asp-for="CompanyName">Company</label>
                <input asp-for="CompanyName" class="form-control" />
                <span class="help-block text-danger" asp-validation-for="CompanyName"></span>
            </div>
            <div class="col-4 mb-3">
                <label asp-for="BranchName">Branch Name</label>
                <input asp-for="BranchName" class="form-control" />
                <span class="help-block text-danger" asp-validation-for="BranchName"></span>
            </div>
            <div class="col-4 mb-3">
                <label asp-for="PhoneNumber">Phone Number</label>
                <input asp-for="PhoneNumber" class="form-control" />
                <span class="help-block text-danger" asp-validation-for="PhoneNumber"></span>
            </div>
        </div>
        <div class="mb-3">
            <label asp-for="Address">Address</label>
            <input asp-for="Address" class="form-control" />
            <span class="help-block text-danger" asp-validation-for="Address"></span>
        </div>
        <div class="mb-3">
            <label asp-for="ShippingAddress">Shipping Address</label>
            <input asp-for="ShippingAddress" class="form-control" />
            <span class="help-block text-danger" asp-validation-for="ShippingAddress"></span>
        </div>
        <div class="form-group mb-3">
            <button type="submit" class="btn btn-primary">Update</button>
        </div>
    </form>
</div>

AdminController.cs


[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateClient(Client client)
{
    _clientRepository.UpdateClient(client);
    return RedirectToAction("Dashboard", "Admin");
}

ClientRepository.cs


public void UpdateClient(Models.Client client)
{
    var result = _dbContext.Entry(client).State = EntityState.Modified;
    await _dbContext.SaveChangesAsync();
}

调试时,我的意思是客户端 ID 返回的 id 为 0 Test Client Data

c# asp.net-mvc asp.net-core entity-framework-core
1个回答
0
投票

回答我自己的问题。我忘记在表单中传递 ClientId,所以我更改的是这样做


<div class="row">
    <form asp-action="UpdateClient" asp-controller="Admin" method="post">

        // Other fields

        <div class="form-group mb-3">
            <button type="submit" class="btn btn-primary">Update</button>
        </div>
    </form>
</div>

到此


<div class="row">
    <form asp-action="UpdateClient" asp-controller="Admin" method="post">
        <input hidden asp-for="ClientId" /> <-- Needed for db detect which entity to change

        // Other fields

        <div class="form-group mb-3">
            <button type="submit" class="btn btn-primary">Update</button>
        </div>
    </form>
</div>

© www.soinside.com 2019 - 2024. All rights reserved.