标识为 [x] 的项目已存在于元数据集合中。我该如何解决?
The item with identity [x] already exists in the metadata collection. How do I fix that?
我正在使用 Entity Framework 6,带有 POCO 和 fluent-API,我注意到一个烦人的错误。
如果我有一个名为 MyEntity
的实体,而该实体有一个名为 MyProp
的 属性,则无法创建名为 MyEntity_MyProp
的实体。
异常:
The item with identity 'MyEntity_MyProp' already exists in the metadata collection.\r\nParameter name: item
如果我重命名任何实体或重命名属性,错误会立即消失。
"bug" 很明显:键 [EntityName]_[PropertyName] 在元数据集合中必须是唯一的。
截图:
我正在将一个包含 390+ 类 的巨大 Entity Framework 模型从数据库优先的 EF 4 迁移到代码优先的 EF 6,使用 fluent-API。重命名实体或表是不可能的。
我该如何解决?
编辑
这个SO问题与我的问题没有任何关系:The item with identity 'Id' already exists in the metadata collection. Parameter name: item
这是一个已知错误。它目前计划在任意 future
版本中修复,也就是说,它还没有在路线图中。
来源:https://entityframework.codeplex.com/workitem/2084
编辑:
根据@Anthony 的说法,这已在 v6.1.3 中修复
当您在实体名称中使用下划线时会发生此错误。原因是 Entity Framework 还使用下划线来创建键的名称(连接实体和 属性 名称)。
因此,如果您有一个名为 "Table" 的实体,其中有一个 属性 "Prop" 和一个名为 "Table_Prop" 的 table,则会发生冲突。这很可能是发生的事情。
请检查您项目中的 ApplicationDbContext
。
也许您的实体名称用作 public DbSet<>
中的 属性 名称。
我可以通过在 EF table 对象上添加 Table 属性,然后将该对象重命名为类似 MyEntityMyProp 的名称来解决此问题。然后我通过代码重构以使用新的对象名称。这比重命名数据库 table.
更简单
[Table("MyEntity_MyProp")]
public class MyEntityMyProp
{
...
}
我正在使用 Entity Framework 6,带有 POCO 和 fluent-API,我注意到一个烦人的错误。
如果我有一个名为 MyEntity
的实体,而该实体有一个名为 MyProp
的 属性,则无法创建名为 MyEntity_MyProp
的实体。
异常:
The item with identity 'MyEntity_MyProp' already exists in the metadata collection.\r\nParameter name: item
如果我重命名任何实体或重命名属性,错误会立即消失。
"bug" 很明显:键 [EntityName]_[PropertyName] 在元数据集合中必须是唯一的。
截图:
我正在将一个包含 390+ 类 的巨大 Entity Framework 模型从数据库优先的 EF 4 迁移到代码优先的 EF 6,使用 fluent-API。重命名实体或表是不可能的。
我该如何解决?
编辑
这个SO问题与我的问题没有任何关系:The item with identity 'Id' already exists in the metadata collection. Parameter name: item
这是一个已知错误。它目前计划在任意 future
版本中修复,也就是说,它还没有在路线图中。
来源:https://entityframework.codeplex.com/workitem/2084
编辑:
根据@Anthony 的说法,这已在 v6.1.3 中修复
当您在实体名称中使用下划线时会发生此错误。原因是 Entity Framework 还使用下划线来创建键的名称(连接实体和 属性 名称)。
因此,如果您有一个名为 "Table" 的实体,其中有一个 属性 "Prop" 和一个名为 "Table_Prop" 的 table,则会发生冲突。这很可能是发生的事情。
请检查您项目中的 ApplicationDbContext
。
也许您的实体名称用作 public DbSet<>
中的 属性 名称。
我可以通过在 EF table 对象上添加 Table 属性,然后将该对象重命名为类似 MyEntityMyProp 的名称来解决此问题。然后我通过代码重构以使用新的对象名称。这比重命名数据库 table.
更简单[Table("MyEntity_MyProp")]
public class MyEntityMyProp
{
...
}