C# 数据库操作预期影响1行,但实际影响非主键上的0行

C# 数据库操作预期影响1行,但实际影响非主键上的0行,c#,entity-framework-core,C#,Entity Framework Core,问题:我想做的是更新行(实体),而不首先获取。 我知道这已经贴了很多次了,但我似乎找不到任何与我的场景相关的答案。 我尝试使用不是主键的值(ServiceBusSequenceNumber)更新行 尝试1 错误: var ybEvent = new YogabandEvent() { ServiceBusSequenceNumber = 4 }; using (var dbContext = _contextFactory.CreateDbContext()) { ybEvent.Sta

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

尝试1

错误

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();
}
var ybEvent = new YogabandEvent() { ServiceBusSequenceNumber = 4 };
using var dbContext = _contextFactory.CreateDbContext();
dbContext.YogabandEvents.Attach(ybEvent);
ybEvent.Status = EventStatus.Completed;
await dbContext.SaveChangesAsync();
数据库操作预期影响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();
}
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();


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

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

您无法插入表中已有的键。你必须使用Update。你能提供一个简短的例子吗?@jdweng是的,但错误是“你不能插入一个不引用父行的子行”,只需先下载该行,这会省去很多麻烦,或者为servicebusnumber=4的更新yogabands SET eventstus='completed'发出SQL原始数据?@user1186050为servicebussequencenumber=4的更新yogabands SET eventstatus='completed'发出SQL原始数据?您不能插入表中已存在的键。你必须使用Update。你能提供一个简短的例子吗?@jdweng是的,但错误是“你不能插入一个不引用父行的子行”,只需先下载该行,这会省去很多麻烦,或者为servicebusnumber=4的更新yogabands SET eventstus='completed'发出SQL原始数据?@user1186050为servicebussequencenumber=4的更新yogabands SET eventstatus='completed'发出SQL原始数据?好,理解。但是,有没有一种方法可以更新/编辑实体,而不必先获取行,也不必使用主键。我只有另一个被索引的列值。也许还需要澄清在c#中创建的新实体没有被赋予值的所有其他属性会发生什么情况?EF不只是更新一个属性…所有其他属性都应该单独使用,而不是changed@user1186050:如果要使用EF进行更新,则需要为这些属性提供值,或者跳过EF并在c#中使用TSQL指定应更新的属性。确定,所以基本上EF不能这样做,除非我提供所有其他值?好的,明白。但是,有没有一种方法可以更新/编辑实体,而不必先获取行,也不必使用主键。我只有另一个被索引的列值。也许还需要澄清在c#中创建的新实体没有被赋予值的所有其他属性会发生什么情况?EF不只是更新一个属性…所有其他属性都应该单独使用,而不是changed@user1186050:如果要使用EF进行更新,则需要为这些属性提供值,或者跳过EF并在c#中使用TSQL指定应更新的属性。确定,所以基本上EF不能这样做,除非我提供所有其他值?