【问题标题】:Database operation expected to affect 1 row(s) but actually affected 0 row(s) on non primary key数据库操作预计会影响 1 行,但实际上影响了非主键上的 0 行
【发布时间】:2021-05-27 17:41:34
【问题描述】:

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

【问题讨论】:

  • 您不能插入表中已经存在的键。您必须使用更新。
  • 你能提供一个简短的例子吗?
  • @jdweng 是的,但是那个错误是“你不能插入一个不引用父行的子行”
  • 只需先下载该行,它会拯救世界的痛苦,或者为 UPDATE yogabands SET eventstus='completed' WHERE servicebusnumber = 4 发出 SQL 原始数据?
  • @user1186050 UPDATE yogabandevents SET eventstatus='completed' WHERE servicebussequencenumber = 4发出SQL raw?

标签: c# entity-framework-core


【解决方案1】:

这主要是因为更改跟踪的工作原理。当您执行new YogabandEvent 并且未指定主键值时,它会被视为一个新实体,因此它会尝试插入该新实体。

【讨论】:

  • 好的,明白了。但是有没有一种方法可以在不先获取行且没有主键的情况下更新/编辑实体。我只有另一个被索引的列值。
  • 也许还澄清了在 c# 中创建的新实体未赋予值的所有其他属性会发生什么? EF 不只是更新一个属性...
  • 所有其他属性应保持不变,不要更改
  • @user1186050 :如果您使用 EF 进行更新,则需要为这些属性提供值,或者跳过 EF 并在您的 c# 中使用 TSQL 来指定应该更新的一个属性.
  • 好的,所以除非我提供所有其他值,否则基本上 EF 无法做到?
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多