c# - 数据库操作预计会影响 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();
解决方案
这主要是因为变更跟踪的工作方式。当您new YogabandEvent
指定或不指定主键值时,它会被视为一个新实体,因此它会尝试插入该新实体。
推荐阅读
- python - 使用多对多关系的购物清单的 Django 模型设计?
- php - 移除所有
里面的标签
- 带有 HTML 净化器的标签
- html - 在跨度内重叠字形
- delphi - 在 Windows10 中使用我自己的应用程序为当前用户注册/注销文件类型的最先进方法?
- python - 基于整数打印不同的输出而不带条件语句
- javascript - Nodejs:从实例变量中引用构造函数变量
- javascript - Express req.body 属性为空
- python - 我用什么来制作一个使用 python 的桌面应用程序来通过交互式 UI 教授轨道力学?
- javascript - 如何直接从数组创建 JS Blob?
- keras - 准确率:精度:召回率:0.9020 始终相同