【问题标题】:The item with identity [x] already exists in the metadata collection. How do I fix that?具有标识 [x] 的项目已存在于元数据集合中。我该如何解决?
【发布时间】:2015-06-07 12:12:49
【问题描述】:

我正在使用带有 POCO 和 fluent-API 的 Entity Framework 6,但我注意到一个烦人的错误。

如果我有一个名为 MyEntity 的实体,并且该实体有一个名为 MyProp 的属性,则无法创建名为 MyEntity_MyProp 的实体。

例外:

The item with identity 'MyEntity_MyProp' already exists in the metadata collection.\r\nParameter name: item

如果我重命名任何实体或重命名属性,错误会立即消失。

“错误”很明显:键 [EntityName]_[PropertyName] 在元数据集合中必须是唯一的。

截图:

我正在将一个包含 390 多个类的大型实体框架模型从 EF 4(数据库优先)迁移到 EF 6(代码优先),并使用 fluent-API。重命名实体或表是没有问题的。

我该如何解决?

编辑

这个 SO 问题与我的问题无关:The item with identity 'Id' already exists in the metadata collection. Parameter name: item

【问题讨论】:

  • 我在使用 EF 6.1.2 时遇到了这个问题。我升级到 EF 6.1.3,问题神奇地消失了。
  • 我在 6.2 上,问题就在我身上。

标签: c# .net entity-framework entity-framework-6 poco


【解决方案1】:

这是一个已知的错误。目前计划在任意future 版本中修复它,也就是说,它还没有在路线图中。

来源:https://entityframework.codeplex.com/workitem/2084

编辑

根据@Anthony 的说法,这已在 v6.1.3 中得到修复

【讨论】:

【解决方案2】:

当您在实体名称中使用下划线时会发生此错误。原因是 Entity Framework 还使用下划线来创建键的名称(连接实体和属性名称)。

因此,如果您有一个名为“Table”且属性为“Prop”的实体和一个名为“Table_Prop”的表,则会发生冲突。这很可能是发生的事情。

【讨论】:

  • 这应该是所报告问题的正确答案。
【解决方案3】:

请在您的项目中查看ApplicationDbContext

也许您的实体名称用作public DbSet<> 中的属性名称。

【讨论】:

    【解决方案4】:

    我可以通过在 EF 表对象上添加 Table 属性,然后将该对象重命名为 MyEntityMyProp 之类的名称来解决此问题。然后我通过代码重构以使用新的对象名称。这比重命名数据库表更简单。

    [Table("MyEntity_MyProp")]
    public class MyEntityMyProp
    {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2019-07-12
      相关资源
      最近更新 更多