我有两个简单的表必须映射到现有数据库中的列:
public class StockItem
{
public System.Guid pkStockItemID { get; set; }
public virtual List<StockItem_ExtendedProperties> ExtendedProperties { get; set; }
}
public class StockItem_ExtendedProperties
{
public System.Guid pkStockItem_ExtendedPropertiesID { get; set; }
public System.Guid fkStockItemId { get; set; }
public virtual StockItem StockItem { get; set; }
}
以下是两者的配置类:
public StockItemConfiguration ()
{
this.HasMany(item => item.ExtendedProperties)
.WithRequired(property => property.StockItem)
.HasForeignKey(property => property.fkStockItemId)
.WillCascadeOnDelete();
}
public StockItem_ExtendedPropertiesConfiguration ()
{
this.HasRequired(property => property.StockItem)
.WithMany(item => item.ExtendedProperties)
.HasForeignKey(property => property.fkStockItemId)
.WillCascadeOnDelete();
}
这会导致错误:The item with identity 'StockItem_ExtendedProperties' already exists in the metadata collection. Parameter name: item
。
似乎从表的两边定义关系导致错误。但是,从任一侧删除配置仍会导致相同的错误。
除了如何解决上述问题之外,我想知道原因是什么,以及应该配置这种关系中的两个表中的哪一个。感谢。
答案 0 :(得分:8)
原来问题是实体名称StockItem_ExtendedProperties
中的下划线。删除那个摆脱了错误。使用EF 6.0.0.0,这是NuGet的最新版本。
答案 1 :(得分:5)
我也有这个问题。名为“Paquete_PartNumber”的类会引发相同的错误。删除下划线可以解决问题。
使用EF 6.0.1。
答案 2 :(得分:1)
删除下划线也解决了我的问题。然而,真正的问题是命名惯例。
重新命名关系一侧的导航集合属性解决了问题,而无需更改数据库中的表名
答案 3 :(得分:0)
我尝试删除下划线,但这对我不起作用。 事实证明,在我的情况下,定义一个(模型)类复数(+ s)搞砸了。删除它后再次工作。非常奇怪,但它解决了它。
使用EF 6.0.0.0