首页 > 解决方案 > EF Core 无法保存修改后的实体

问题描述

我正在开发一个使用 EF Core(版本 5.0.5)和 MySql 数据库的应用程序。我的上下文是这样设置QueryTrackingBehaviorNoTracking,当我尝试保存修改后的实体时,出现以下异常:

数据库操作预计会影响 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 无法保存我的实体?

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

标签: c#entity-frameworkentity-framework-core

解决方案


推荐阅读