使用Entity Framework Core 3.0并遇到一个奇怪的问题,即如果我尝试更新ID = 0的实体,EF会抛出异常,它认为ID = 0是一个临时值。相同的代码可以更新ID = 1或更高的实体,而不会出现任何问题。
例外:
InvalidOperationException:实体类型“ MyType”上的属性“ Id”具有临时值 同时尝试将实体的状态更改为“已修改”。要么 显式设置永久值或确保数据库为 配置为为此属性生成值。
以下语句触发异常:
'reports'
我不想重新设定所有以1开始的表。
这是EF的预期行为吗?应该可以保存ID = 0的实体。
有关如何解决此问题的任何建议?
谢谢。
答案 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;
那是另一枚定时炸弹。后来的代码更改删除了第一个条件(未附加条件)和动臂。