实体框架6中的一对多关系

时间:2013-11-22 07:55:38

标签: c# .net entity-framework

我有两个简单的表必须映射到现有数据库中的列:

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

似乎从表的两边定义关系导致错误。但是,从任一侧删除配置仍会导致相同的错误。

除了如何解决上述问题之外,我想知道原因是什么,以及应该配置这种关系中的两个表中的哪一个。感谢。

4 个答案:

答案 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