Entity Framework ID 为 0 的实体更新失败
Entity Framework Update Fails for Entity With ID of 0
使用 Entity Framework Core 3.0 并面临一个奇怪的问题,如果我尝试更新 ID=0 的实体,EF 会抛出异常,它认为 ID=0 是一个临时值。相同的代码更新 ID=1 或更高版本的实体没有任何问题。
异常:
InvalidOperationException: The property 'Id' on entity type 'MyType' has a temporary value
while attempting to change the entity's state to 'Modified'. Either
set a permanent value explicitly or ensure that the database is
configured to generate values for this property.
以下语句触发异常:
_context.Attach(MyType).State = EntityState.Modified;
我不想重新播种我所有的表以从 1 开始。
这是 EF 的预期行为吗?应该可以保存 ID=0 的实体。
关于如何解决这个问题有什么建议吗?
谢谢。
你必须对这个零ID
值做点什么。这是一颗定时炸弹。
你必须时刻保持警惕,因为这绝对是意料之中的行为。 EF 具有取决于键默认值的内部逻辑。在 EF6 中,您可以这样做,因为它不够精炼。 (在这个区就是)。
让我来告诉你留下这个 ID 值在未来会如何适得其反。
你有这个 MyType
对象。我们称它为 entity
以遵循一些命名 conventions/habits。它的 ID 值为 0
,并且没有附加到上下文。
现在假设您不使用这种相当冗余的方式来附加修改后的内容,而是使用新的 EF-core 方式:
context.Update(entity);
现在您不会看到任何异常,但是不,问题尚未解决。情况变得更糟了。 entity
对象的状态现在是 Added
,您要向 table 添加一条新记录。这甚至可能有一段时间没有引起注意,增加了您以后必须清理的一堆烂摊子。
如果它的 ID
值为 > 0
,EF 的 Update
方法会断定它是一个现有实体,它的状态应该是 Modified
。
您可以将entity
的状态设置为Modified
,如果(1)它没有附加并且(2)您使用...
context.Entry(entity).State = EntityState.Modified;
这又是一颗定时炸弹。后来的代码更改删除了第一个条件(它没有附加)和繁荣。
使用 Entity Framework Core 3.0 并面临一个奇怪的问题,如果我尝试更新 ID=0 的实体,EF 会抛出异常,它认为 ID=0 是一个临时值。相同的代码更新 ID=1 或更高版本的实体没有任何问题。
异常:
InvalidOperationException: The property 'Id' on entity type 'MyType' has a temporary value while attempting to change the entity's state to 'Modified'. Either set a permanent value explicitly or ensure that the database is configured to generate values for this property.
以下语句触发异常:
_context.Attach(MyType).State = EntityState.Modified;
我不想重新播种我所有的表以从 1 开始。
这是 EF 的预期行为吗?应该可以保存 ID=0 的实体。
关于如何解决这个问题有什么建议吗?
谢谢。
你必须对这个零ID
值做点什么。这是一颗定时炸弹。
你必须时刻保持警惕,因为这绝对是意料之中的行为。 EF 具有取决于键默认值的内部逻辑。在 EF6 中,您可以这样做,因为它不够精炼。 (在这个区就是)。
让我来告诉你留下这个 ID 值在未来会如何适得其反。
你有这个 MyType
对象。我们称它为 entity
以遵循一些命名 conventions/habits。它的 ID 值为 0
,并且没有附加到上下文。
现在假设您不使用这种相当冗余的方式来附加修改后的内容,而是使用新的 EF-core 方式:
context.Update(entity);
现在您不会看到任何异常,但是不,问题尚未解决。情况变得更糟了。 entity
对象的状态现在是 Added
,您要向 table 添加一条新记录。这甚至可能有一段时间没有引起注意,增加了您以后必须清理的一堆烂摊子。
如果它的 ID
值为 > 0
,EF 的 Update
方法会断定它是一个现有实体,它的状态应该是 Modified
。
您可以将entity
的状态设置为Modified
,如果(1)它没有附加并且(2)您使用...
context.Entry(entity).State = EntityState.Modified;
这又是一颗定时炸弹。后来的代码更改删除了第一个条件(它没有附加)和繁荣。