c# - 实体框架要么不更新,要么在尝试更新时抛出异常
问题描述
我可以添加一个实体,但是当我尝试更新实体框架时不起作用。这就是我正在做的事情:
在 Web API 中获取模型中的动作过滤器。我在数据库中查找有关此模型的一些数据,并使用它来更改/水合模型的不同部分。是的,它必须是那样的。
控制器运行。控制器除了将模型传递到要保存的存储库之外什么都不做。
存储库检查数据库中是否存在具有该 ID 的模型。如果是这样,它会尝试附加然后保存。
代码:
_db.Airplanes.Attach(airplane);
// _db.Entry(airplane).State = EntityState.Modified; // doesn't do anything
_db.SaveChanges();
它不起作用。相反,它会抛出以下错误消息:
System.Data.Entity.Core.OptimisticConcurrencyException:'存储更新、插入或删除语句影响了意外的行数 (0)。自加载实体后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540 。
也许问题是我最初在动作过滤器中获得了实体,但它已经脱离了上下文或其他什么?无论如何,我不知道为什么 Entity Framework 不允许我将其添加回来。
编辑:我被迫编辑这个以解释另一个问题如何解决这个问题。……嗯,不是。举证责任应由提出索赔的人承担。
解决方案
答案是在我的操作过滤器中,我调用 AirplaneRepository 来获取飞机的 ID。虽然我只使用了 ID,但我猜它仍然将整个飞机添加到它的黑匣子(实体框架的黑匣子)中。解决方案是将飞机与 EF 分离。
AirplaneRepository.cs
async Task<Airplane> GetAirplane(int partId, bool detachFromEF = false)
{
var airplane = await _db.Airplane.SingleOrDefaultAsync(c => c.partId == partId);
if(detachFromEF)
{
_db.Entry(airplane).State = EntityState.Detached; // <-- the fix
}
return airplane;
}
async Task<int?> GetAirplaneId(int partId)
{
var airplane = await GetAirplane(partId, true);
return airplane == null ? (int?)null : airplane.AirplaneId;
}
}
推荐阅读
- django - 限制用户可以上传的文件数量
- javascript - 为什么我的文本不能在浏览器中正确测量?
- amazon-s3 - 如何将输入转换器用于 ECS Fargate 启动类型和 Terraform CloudWatch 事件触发器
- python - 我可以在某些列值上使用 pandas 数据框读取一系列行吗?
- flutter - 'file.existsSync()': 不正确
- android - Flutter - 具有无限高度错误的水平 ListView
- excel - 查找列中的最后一个值(不是最后一行)
- c# - Microsoft Edge WebView2 - 错误:命名空间“Microsoft”中不存在类型或命名空间名称“Web”
- swift - 声明仅在文件范围内有效错误 SWIFT 应用程序项目
- javascript - 鼠标移动时单击recaptcha