我使用实体框架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]在元数据集合中必须是唯一的。
截图:
我正在将一个庞大的实体框架模型从EF 4(数据库优先)转移到EF 6,代码优先,使用fluent-API。重命名实体或表格是不可能的。
我该如何解决?
修改
这个问题与我的问题没有任何关系:The item with identity 'Id' already exists in the metadata collection. Parameter name: item
答案 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
{
...
}