2013-11-22 89 views
5

我有必須映射到列在現有的數據庫中有兩個簡單的表:一到實體框架多對多關係6

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

我試過你的代碼,它工作正常。它只是要求我在:configuration HasKey(k => k.pkStockItemID)中定義主鍵; – Raphael

+0

@Raphael:問題原來完全不同。出於某種原因,名稱爲'StockItem_ExtendedProperties'的下劃線因EF而跳閘。刪除,使其工作。我正在使用EF 6.0.0.0,並想知道它是否是一個錯誤或是否不允許下劃線。 –

回答

8

原來問題是實體名稱StockItem_ExtendedProperties中的下劃線。刪除,擺脫了錯誤。使用通過NuGet最新版本的EF 6.0.0.0。

+0

更正了我的問題。你會發現他們已經解決了這個問題 –

+0

你是怎麼弄出來的?這也確實解決了我的問題,雖然 – andryuha

+0

也幫助過我,也許有一個使用相同名稱的映射,所以您的DbSet對象名稱不能相同? – Evan

5

我也有這個問題。名爲「Paquete_PartNumber」的類會引發相同的錯誤。刪除下劃線解決了這個問題。

使用EF 6.0.1。

1

刪除下劃線解決了我的問題。然而真正的問題是命名約定。

重命名的關係的一個側面的導航集合屬性解決了這個問題,而不必在數據庫

0

我試着刪除下劃線,但沒有爲我工作來改變表名。 原來,在我的情況下定義一個(模型)類複數(+ s)搞砸了。刪除後,它再次工作。非常奇怪,但它解決了它。

使用EF 6.0.0.0