2011-05-12 147 views
4

我正在玩EF Code First,需要一些幫助。實體框架代碼首先 - 多對多外鍵問題

用戶可以創建許多帖子。
用戶可以推薦很多文章
文章可以有很多用戶推薦。

鑑於此代碼:

public class User 
{ 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Post> Posts { get; set; } 
    public virtual ICollection<Post> Recommendations { get; set; } 
} 


public class Post 
{ 
    public int PostID { get; set; } 
    public int UserID { get; set; } 
    public virtual User User { get; set; } 
    public virtual ICollection<User> RecommendingUsers { get; set; } 
} 

modelBuilder.Entity<Post>() 
.HasMany(x => x.RecommendingUsers) 
.WithMany(x => x.Recommendations) 
.Map(x => x.MapLeftKey("PostID") 
    .MapRightKey("UserID") 
    .ToTable("Recommendations")); 

我結束了在Post表一個額外的 「User_UserID」 一欄,它是一個使用外鍵:

帖子ID(PK,INT,不空)
用戶ID(INT非空)
User_UserID(FK,INT,NULL)

爲什麼是不是使用用戶ID爲t他外鍵?

+0

你確定。我剛剛使用了你的代碼,它按預期工作。 – 2011-05-12 19:29:28

+0

我甚至嘗試手動刪除數據庫並讓EF重新創建它。我仍然以User_UserID列結束。那麼,你只有你的PostID和UserID列? – Matador1006 2011-05-12 19:42:20

+0

是的。我只將所有ID重命名爲Id。它的工作。 – 2011-05-12 19:45:25

回答

1

我有同樣的問題,並發現兩件事情:

  1. 它的使用映射列名的慣例是一樣User_UserID和USER_ID,沒有用戶名的名字。解決方案:
    1. 您可以改變它使用的約定。我不清楚在EF 4.1中這是否可行 - Scott Gu有一篇文章感嘆它不是,但是我可以看到一個Conventions屬性掛在ModelBuilder類中......只有一種方法... Add( )。
    2. 您可以顯式設置外鍵名稱(見下文)。
  2. 我曾經根據StackOverflow上的建議實際修復過它,但緩存的DbModel意味着它仍然出現故障,直到我實際關閉Cassini並強制完全重新啓動dev web服務器。

不幸的是,因爲你不使用的命名約定的框架假設,你將不得不使用ForeignKey的所有屬性在你的班,使一切一起正確配合保持,否則將保留映射到錯誤的列名稱。

設置外鍵名字看起來像:

[ForeignKey("UserID")] 
public virtual User User { get; set; } 

這明確地告訴編譯器使用用戶名,而不是User_UserID

在許多對許多案件的框架,需要兩個使用上述地圖調用,並在兩側應用ForeignKey屬性。

這解決了它對我來說。

我現在看到斯科特爲什麼要離開約定 - 當你試圖將事物放在一個現有的數據庫上時,這真的會燒傷。

+0

感謝您的幫助。你指出我正確的方向。我也最終不得不使用User_Id爲空或者我會得到這個錯誤:「在表'Posts'中引入FOREIGN KEY約束'User_Posts'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。無法創建約束。「你有沒有看到那種行爲?你能告訴我如何使用Fluent API解決這個問題嗎?我似乎無法得到正確的語法...:/ – Matador1006 2011-05-26 22:13:01