Entity framework core DbContext Remove在DATETIME包含毫秒时生成DbUpdateConcurrencyException

Entity framework core DbContext Remove在DATETIME包含毫秒时生成DbUpdateConcurrencyException,entity-framework-core,asp.net-core-mvc,entity-framework-core-5,Entity Framework Core,Asp.net Core Mvc,Entity Framework Core 5,我在一个webapp中管理一个“遗留”表。它使用一个复合键,而不是一个自动递增的整数,我在建模过程中注册了它: modelBuilder.Entity<EmployeeLog>().HasKey(table => new { table.EmployeeID, table.DateCreated }); 调用savechangesync时,我收到一个错误: DbUpdateConcurrencyException:数据库操作预期影响1行,但实际影响0行。自加载实体后,数据可能

我在一个webapp中管理一个“遗留”表。它使用一个复合键,而不是一个自动递增的整数,我在建模过程中注册了它:

modelBuilder.Entity<EmployeeLog>().HasKey(table => new { table.EmployeeID, table.DateCreated });
调用
savechangesync
时,我收到一个错误:

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

模型已正确识别并包含预期数据

我认为这个问题与日期的粒度有关。如果包括毫秒,例如
2021-04-27 08:06:33.193
,则会生成错误。例如,如果日期/时间不包括毫秒,
2021-04-27 08:06:33.000
,则删除操作正常

我可以在创建记录时截断毫秒,但是如果记录已经包含毫秒,我想知道是否有办法处理这个问题

**编辑**


我无法控制供应商的数据库决策,因此我需要一个解决方案来解决这个问题。

不要使用这样的密钥。如果您必须(为什么?),请不要使用
datetime
,而是使用具有固定精度的
datetime2
。A
datetime
是一个浮点数,其小数部分表示24小时日期中的时间,精度为3.33毫秒。不用说,它是不精确的<代码>日期时间2(3)将保持您指定的精度,但。。。为什么?例如,如果要存储历史数据,可以在SQL Server中使用。如果不能使用它们,请不要将所有版本存储在同一个表中。现在,您无法确保只有一条“当前”员工记录,也无法在外键约束中使用
EmployeeID
。通常,当上下文生命周期被错误处理时,我会遇到此类错误。奇怪的是,它必须处理表字段的类型。
我需要一个解决方案来解决这个问题。
现实是SQL Server的
日期时间
没有毫秒精度。其分辨率为3.33。这意味着,除非毫秒计数(大致)是3的倍数,否则它无法表示
0.193
不能用
datetime
表示。您必须至少将字段的类型更改为
datetime2(3)
,或者从实体的键中排除
DateCreated
字段。您可能可以映射到只返回“当前”行的视图。我可以在我这方面重现这个问题,如果datetime包含毫秒,则在调用SaveChange方法时将显示DbUpdateConcurrencyException。我建议您将此问题反馈给。此外,作为一种解决方法,您可以更改日期时间并删除毫秒。或者,您可以引用并使用ExecuteSqlRaw方法执行SQL命令并删除实体。
...

// the UI stores the date/time without milliseconds, use a theta join to bracket the time
var model = await _context.EmployeeLogs.FirstOrDefaultAsync(l => l.EmployeeID == driverID && (l.DateCreated >= date && l.DateCreated < date.AddSeconds(1)));

_context.Remove(model);

var result = await _context.SaveChangesAsync();