2

我有一個ASP.NET MVC3應用程序,其中使用實體框架4.3代碼優先和遷移。MVC3中相同類型實體之間的多對多關係

我一直在嘗試在相同類型的實體之間創建多對多的關係,但是當我使用Migrations搭建遷移時,它會生成一對一的關係。

這個想法是,一個用戶應該能夠關注多個其他用戶(想想Twitter)。

User模型是這個樣子:

public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public DateTime Registered { get; set; } 
    ... 
    public virtual ICollection<User> Follows { get; set; } 
} 

當我腳手架的增加跟隨屬性,我得到一個遷移這樣的:

public partial class FollowUser : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("User", "User_UserId", c => c.Int()); 
     AddForeignKey("User", "User_UserId", "User", "UserId"); 
     CreateIndex("User", "User_UserId"); 
    } 

    ... 
} 

所以實體框架解釋我的模型兩個用戶之間的一對一關係。

如何在相同類型的實體之間創建多對多關係?

+1

@Blast_dan感謝您的回覆!不知道這個問題如何與此相關? –

+0

Woops錯誤鏈接 http://stackoverflow.com/questions/9683716/mapping-for-self-referencing-entity-in-ef-code-first –

回答

12

由於它是多對多自我聯接關係,用戶實體應具有類型UserFollowersFollowing屬性。所以,讓我們改變你的類包括那些

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; }  
    public virtual ICollection<User> Followers { get; set; } 
    public virtual ICollection<User> Following { get; set; } 
} 

現在更新的DbContext類,以便它返回用戶

public DbSet<User> Users { set; get; } 

我們需要告訴的EntityFramework,我們需要有一個多對多的一個屬性這兩者之間有關係所以,讓我們做,與流利的API通過覆蓋OnModelCreating方法

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().HasMany(m => m.Followers).WithMany(p => p.Following).Map(w => w.ToTable("User_Follow").MapLeftKey("UserId").MapRightKey("FollowerID")); 
    base.OnModelCreating(modelBuilder); 
} 

現在實體框架將創建一個這樣的表。

enter image description here

請注意,我們明確告訴實體框架使用用戶IDFollowerId作爲Forign鍵列名。如果我們沒有提及,EF將使用User_IDUser_ID1作爲列名。

+0

非常感謝!這是一個非常好的答案,非常明確。如果可以,我會+2。 –

+0

@ChristoferEliasson:很高興知道這對你有所幫助。 – Shyju

+0

非常感謝。我想添加一些額外的列到User_Follower表。是否有可能將此表作爲實體? 另外我注意到追隨者和followees正在急切地加載,會導致性能問題,因爲我寧願加載他們懶惰 – Deliganli

相關問題