EF Core数据库操作引发错误“自加载实体以来,数据可能已被修改或删除”

时间:2019-12-18 20:17:50

标签: c# .net .net-core entity-framework-core

我正在使用EF Core 3.1,具有以下代码

public void Update()
{
    Client client = new Client();
    client.ClientId = 1;
    client.Name = "New Client 1";

    dbContext.Entry<Client>(client).State = EntityState.Modified;
    dbContext.Entry<Client>(client).Property(x => x.IdentityNumber).IsModified = false;

    dbContext.SaveChanges();
}

产生以下SQL并成功更新列

UPDATE [Client] 
SET [Name] = @p0
WHERE [ClientId] = @p1;

SELECT @@ROWCOUNT;

但是,当我更改从数据库中删除的条目ClientId = 4时,它会产生相同的SQL查询,但会引发以下错误

  

数据库操作预期会影响1行,但实际上会影响0行。自加载实体以来,数据可能已被修改或删除

错误消息很清楚,但是我不明白为什么它不起作用,因为SQL Server正常工作(受影响的0行),而是抛出此错误。

如何使用EF Core模拟0行受影响的SQL Server行为?

如果行存在然后更新,我不想先查询数据库。上面的代码是一个示例。在我的方法中,我有很多客户端的列表,这些列表需要立即更新,而使用第一个检查是否存在然后再更新需要很长时间。

1 个答案:

答案 0 :(得分:0)

  

如果该行存在,我不想先查询数据库,然后再更新。

这是问题的症结所在,也是导致错误的原因。

我们的方法(我相信是一种常见的方法)是在处理大量数据时使用Dapper,并将EF限制为“加载”->“编辑”->“对单个或很少实体进行保存”操作。