ID为0的实体的实体框架更新失败

时间:2019-09-30 16:17:45

标签: entity-framework temporary

使用Entity Framework Core 3.0并遇到一个奇怪的问题,即如果我尝试更新ID = 0的实体,EF会抛出异常,它认为ID = 0是一个临时值。相同的代码可以更新ID = 1或更高的实体,而不会出现任何问题。

例外:

  

InvalidOperationException:实体类型“ MyType”上的属性“ Id”具有临时值   同时尝试将实体的状态更改为“已修改”。要么   显式设置永久值或确保数据库为   配置为为此属性生成值。

以下语句触发异常:

'reports'

我不想重新设定所有以1开始的表。

这是EF的预期行为吗?应该可以保存ID = 0的实体。

有关如何解决此问题的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:1)

必须对此零ID值进行处理。这是一个定时炸弹。

您始终必须保持警惕,因为这绝对是预期的行为。 EF具有内部逻辑,具体取决于键的默认值。在EF6中,您可以执行此操作,因为它不够完善。 (在区域中)。

让我向您展示如何保留此ID值将来会适得其反。

您有这个MyType对象。我们将其称为entity,以遵循一些命名约定/习惯。其ID值为0,并且未附加到上下文。

现在,假设您不是使用这种多余的方式将其附加为修改后的内容,而是使用新的EF核心方式:

context.Update(entity);

现在您将看不到任何异常,但是不,问题尚未解决。变得更糟了。 entity对象的状态现在为Added,您将向表中添加新记录。甚至有一段时间可能不会引起注意,这会增加一堆混乱,您以后必须清理。

如果其ID的值为> 0,EF的Update方法将得出结论,它是一个现有实体,其状态应为Modified

如果(1)未连接{2)您正在使用...

,您可以entity的状态设置为Modified
context.Entry(entity).State = EntityState.Modified;

那是另一枚定时炸弹。后来的代码更改删除了第一个条件(未附加条件)和动臂。

相关问题