具有标识[x]的项目已存在于元数据集合中。我该如何解决这个问题?

时间:2015-04-02 13:51:16

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

我使用实体框架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]在元数据集合中必须是唯一的。

截图:

Image

我正在将一个庞大的实体框架模型从EF 4(数据库优先)转移到EF 6,代码优先,使用fluent-API。重命名实体或表格是不可能的。

我该如何解决?

修改

这个问题与我的问题没有任何关系:The item with identity 'Id' already exists in the metadata collection. Parameter name: item

4 个答案:

答案 0 :(得分:10)

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

因此,如果您有一个名为“Table”的实体,其属性为“Prop”,而一个名为“Table_Prop”的表将发生冲突。这很有可能发生了什么。

答案 1 :(得分:8)

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

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

修改

根据@Anthony,这在v6.1.3

中已得到修复

答案 2 :(得分:0)

请检查您项目中的ApplicationDbContext

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

答案 3 :(得分:0)

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

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