首页 > 解决方案 > 数据库操作预计会影响 1 行,但实际上影响了非主键上的 0 行

问题描述

问题:我想做的是在不先获取的情况下更新行(实体)。我知道这已经发布了很多次,但我似乎找不到与我的场景相关的任何答案。我正在尝试使用不是主键 (ServiceBusSequenceNumber) 的值来更新行。

尝试 1

错误

数据库操作预计会影响 1 行,但实际上会影响 0 行

代码

var ybEvent = new YogabandEvent() { ServiceBusSequenceNumber = 4 };
using (var dbContext = _contextFactory.CreateDbContext())
{
    ybEvent.Status = EventStatus.Completed;
    dbContext.Entry<YogabandEvent>(ybEvent).State = EntityState.Modified;
    await dbContext.SaveChangesAsync();
}

尝试 2

错误

"INSERT 语句与 FOREIGN KEY 约束 "FK_YogabandEvents_Yogabands_YogabandId" 冲突。冲突发生在数据库 "yogabandy2020-dev" 表 "dbo.Yogabands" 列 'Id' 中。\n语句已终止。"

代码

var ybEvent = new YogabandEvent() { ServiceBusSequenceNumber = 4 };
using var dbContext = _contextFactory.CreateDbContext();
dbContext.YogabandEvents.Attach(ybEvent);
ybEvent.Status = EventStatus.Completed;
await dbContext.SaveChangesAsync();

仅供参考:我可以先获取更新,如下所示,但我想更新行而不先获取:

using var dbContext = _contextFactory.CreateDbContext();
var ybEvent = await dbContext.YogabandEvents.Where(p => p.ServiceBusSequenceNumber == 4).FirstOrDefaultAsync();
ybEvent.Status = EventStatus.Completed;
await dbContext.SaveChangesAsync();

标签: c#entity-framework-core

解决方案


这主要是因为变更跟踪的工作方式。当您new YogabandEvent指定或不指定主键值时,它会被视为一个新实体,因此它会尝试插入该新实体。


推荐阅读