c# - EF Core 无法保存修改后的实体
问题描述
我正在开发一个使用 EF Core(版本 5.0.5)和 MySql 数据库的应用程序。我的上下文是这样设置QueryTrackingBehavior
的NoTracking
,当我尝试保存修改后的实体时,出现以下异常:
数据库操作预计会影响 1 行,但实际上会影响 0 行。自加载实体以来,数据可能已被修改或删除。看 ...
该应用程序使用 Repository/UnitOfWork 模式,但代码基本上归结为:
public class MyEntity
{
public Guid Id {get; set;}
public int Counter {get; set;}
}
public async Task UpdateCounter(Guid id)
{
DbContextOptionsBuilder<DatabaseContext> builder = new DbContextOptionsBuilder<DatabaseContext>()
.UseMySql(CONNECTION_STRING, ServerVersion.AutoDetect(CONNECTION_STRING), options =>
{
options.UseNetTopologySuite();
})
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
MyDbContext context = new MyDbContext(builder.Options);
MyEntity entity = await context.Set<MyEntity>().FirstOrDefaultAsync(e => e.Id == id);
entity.Counter += 1;
context.Update(entity);
await context.SaveChangesAsync();
}
作为测试,我将结果存储context.Update(entity);
到一个变量中,这样我就可以在调试中检查它并且它看起来是正确的(据我所知),状态说它已被修改但我仍然得到异常。
我在网上做了一些阅读并找到了一些建议并尝试替换context.Update(entity);
为:
context.Attach(entity).State = EntityState.Modified;
结果相同。我也试过:
context.Entry(entity).State = EntityState.Modified;
这也有同样的结果。在我的阅读中,我有点困惑这三行之间的区别是什么。
我的主要问题是:为什么 EF Core 无法保存我的实体?
编辑 一些可能很重要的信息:
MyEntity.Counter
设置为并发令牌并具有默认值- 向数据库添加新实体没问题,只是更新导致了异常
解决方案
推荐阅读
- c# - 从 URL 获取 HTML 时出现异常
- django - 当视图实际工作时,为什么我的 Django 测试失败了?
- python-3.x - ClientError: 调用 PutLogEvents 操作时发生错误 (ThrottlingException) (达到最大重试次数: 4) 超出速率
- ansible - Hyperledge Fabric VS 代码 ansible-playbook
- javascript - React + JavaScript:如何在注册页面成功输入 200 码后删除数据字段并重定向到登录?
- c# - 如何从 Microsoft.Toolkit WebView 获取 HTML?
- postgresql - postgresql 中的索引
- c# - 提交表单 C# MVC .NET Core 后出现 400 错误
- openstreetmap - 使用 OSMNX 打开街道地图:如何检索公交路线?
- python - 为什么在启动时运行文件的python代码不起作用?