C# EF Core无法保存修改的实体

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

我正在开发一个使用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.Entry(entity).State = EntityState.Modified;
这也有同样的结果。在我的阅读中,我有点困惑这三行之间的区别是什么

我的主要问题是:为什么EF Core无法拯救我的实体

编辑 一些可能很重要的信息:

  • MyEntity.Counter
    设置为并发令牌,并具有默认值
  • 向数据库添加新实体没有问题,只是更新导致了异常

您有主键吗?当您使用主键执行插入时,当该键位于数据库中时,您将得到零行更改,然后您需要使用update。同样,如果您执行更新并且密钥不在数据库中,您将得到零行更改,然后您需要执行插入。
MyEntity.Id
是主键,并且它确实存在于数据库中,因此我预计更新将影响1行否。仅更新会更改现有密钥。显然,问题在于非跟踪查询和更新标记为并发令牌的字段,而不首先检索原始值(或者在修改之前通过先附加让EFC change tracker知道原始值)。一般来说,
Update
method和您提到的所有其他“强制更新”方法都不适用于修改的并发令牌字段。@IvanStoev您是对的。我删除了我的
DbContext
中的
IsConcurrencyToken()
,它可以正常工作。事后看来,这应该是显而易见的。我将尝试在默认情况下启用跟踪,并在需要时使用
AsNoTracking()
。在这一切发生之前,我本应该问一个问题,有没有更好的办法让一场有计数器的争吵?我的每一行都需要保留特定对象的计数,我希望确保它们正确处理并发写入。对我来说,使用并发令牌似乎是正确的方法,但我可能错了
context.Entry(entity).State = EntityState.Modified;