2011-06-28 144 views
2

大家好,實體框架 - 錯誤:定義實體類型的關鍵

我有以下簡單的模型。

public class A 
{ 
    public B B { get; set; } 
    public C C { get; set; } 

} 

public class B 
{ 
    public int Id { get; set; } 


} 

public class C 
{ 
    public int Id { get; set; } 

} 

我得到一個錯誤,當我試圖讓數據:

System.Data.Edm.EdmEntityType: : EntityType 'A' has no key defined. Define the key for this EntityType.

上,然後經「願意與我們」來完成。有沒有人在這個問題的幫助下解決這個問題?

在此先感謝!

回答

1

EF中的每個實體都必須有一個主鍵。它看起來像A是多對多的聯結表,所以你有多種選擇。

刪除完全以讓EF處理許多一對多:

public class B 
{ 
    public int Id { get; set; } 
    public virtual ICollection<C> Cs { get; set; } 
} 

public class C 
{ 
    public int Id { get; set; } 
    public virtual ICollection<B> Bs { get; set; } 
} 

如果你想爲實體,你必須定義附加鍵:

public class A 
{ 
    public int Id { get; set; } 
    public B B { get; set; } 
    public C C { get; set; } 
} 

,或者您必須包括FK屬性對於B和C並將它們都標記爲複合主鍵(也應該在db中):

public class A 
{ 
    public int bId { get; set; } 
    public int cId { get; set; } 
    public B B { get; set; } 
    public C C { get; set; } 
} 

E DIT:

映射最後的解決方案

modelBuilder.Entity<A>.HasKey(a => new { a.bId, a.cId }); 
modelBuilder.Entity<A>.HasRequired(a => a.B) 
         .WithMany() 
         .HasForeignKey(a => a.bId); 
modelBuilder.Entity<A>.HasRequired(a => a.C) 
         .WithMany() 
         .HasForeignKey(a => a.cId); 

無論如何,如果你一個看起來完全一樣,你沒有你肯定做錯了任何其他屬性描述。僅當映射A包含其他任何內容時才需要映射A,然後導航屬性/ FK用於建模多對多關係。

+0

感謝您的快速回答。但是,如果我添加一個額外的鍵或新的屬性,那麼當我試圖獲取數據時,我會得到一個錯誤,例如使用toList()。我如何將它們標記爲「複合主鍵」以排除它們? – r3d

+0

這不僅僅是添加屬性 - 這些屬性必須映射到數據庫列(=它們也必須存在於數據庫中) - 它們不能被排除。您使用的是什麼版本的EF,以及您使用的是哪種類型的映射? –

+0

EF版本是4.0.30319。我使用「WithMany()。Map(x => x.MapKey(」Id「));」其中Id是B的fk,對於c的id是相同的。如果我添加兩個新的ID,我不能將它們映射到相同的ID。 – r3d