C# EF Core无法保存修改的实体
我正在开发一个使用EF Core(5.0.5版)和MySql数据库的应用程序。我的上下文设置为C# EF Core无法保存修改的实体,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我正在开发一个使用EF Core(5.0.5版)和MySql数据库的应用程序。我的上下文设置为QueryTrackingBehavior为NoTracking,当我试图保存修改过的实体时,会出现以下异常: 数据库操作预期影响1行,但实际影响0行。自加载实体后,数据可能已被修改或删除。看 应用程序使用Repository/UnitOfWork模式,但代码基本上归结为: public class MyEntity { public Guid Id {get; set;} publi
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.Entry(entity).State = EntityState.Modified;
这也有同样的结果。在我的阅读中,我有点困惑这三行之间的区别是什么
我的主要问题是:为什么EF Core无法拯救我的实体
编辑
一些可能很重要的信息:
设置为并发令牌,并具有默认值MyEntity.Counter
- 向数据库添加新实体没有问题,只是更新导致了异常
MyEntity.Id
是主键,并且它确实存在于数据库中,因此我预计更新将影响1行否。仅更新会更改现有密钥。显然,问题在于非跟踪查询和更新标记为并发令牌的字段,而不首先检索原始值(或者在修改之前通过先附加让EFC change tracker知道原始值)。一般来说,Update
method和您提到的所有其他“强制更新”方法都不适用于修改的并发令牌字段。@IvanStoev您是对的。我删除了我的DbContext
中的IsConcurrencyToken()
,它可以正常工作。事后看来,这应该是显而易见的。我将尝试在默认情况下启用跟踪,并在需要时使用AsNoTracking()
。在这一切发生之前,我本应该问一个问题,有没有更好的办法让一场有计数器的争吵?我的每一行都需要保留特定对象的计数,我希望确保它们正确处理并发写入。对我来说,使用并发令牌似乎是正确的方法,但我可能错了
context.Entry(entity).State = EntityState.Modified;