2016-03-06 94 views
2

我在c#中使用實體框架,Asp.net標識和MVC來創建我的網站。自定義類標識/實體框架多對多關係

試圖實現一個 「羣」 功能,我一直面臨的一個問題... 我實現了休閒(在此基礎上:Create code first, many to many, with additional fields in association table):

public class ApplicationUser : IdentityUser 
{ 

    [...] 

    public virtual List<Group> Groups { get; set; } 
} 

和:

public class Group 
{ 
    public int GroupID { get; set; } 
    [Required] 
    [StringLength(100, MinimumLength = 2)] 
    public string Name { get; set; } 

    public virtual List<ApplicationUser> Members { get; set; } 
} 

並額外屬性(狀態)的鏈接類:

public class ApplicationUserGroup 
{ 
    [Key, Column(Order = 0)] 
    public string ApplicationUserId { get; set; } 
    [Key, Column(Order = 1)] 
    public int GroupId { get; set; } 

    public virtual ApplicationUser ApplicationUser { get; set;} 
    public virtual Group Group { get; set; } 

    // 1 : simple member 
    // 2 : administrator 
    public int Status { get; set; } 

    public ApplicationUserGroup() 
    { 
     Status = 1; 
    } 
} 

我設法讓我的表作爲ApplicationUserGroups到我的數據庫,但實體繼續生成另一個表GroupApplicationUsers沒有我的狀態字段...

我相信問題來自身份,任何人都可以幫助我?

PS:對不起,我的英語,我是法國人^^

回答

2

您需要使用相應的屬性來裝飾你的實體屬性或使用流利的API,使EF明白你正在嘗試做的。所以使用流利的api,在你的 DbContext類中,你應該重寫 OnModelCreating方法。然後使用下面的代碼:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<ApplicationUser>() 
     .HasMany(au => au.Groups) 
     .WithMany(grp => grp.Members) 
     .Map(m => 
     { 
      m.ToTable("ApplicationUserGroup"); 
      m.MapLeftKey("ApplicationUserId"); 
      m.MapRightKey("GroupId"); 
     }); 
} 

這告訴EF使用您 ApplicationUserGroup實體/表作爲結表許多一對多的關係。

編輯。根據您提供的鏈接,上述解決方案僅適用於您讓EF將連接表本身作爲隱藏表處理的情況。你不能在你的模型中使用它。所以正確的解決方案是使用兩個一對多的關係到你的模型中存在的連接表。

首先改變你的實體類如下:

public class ApplicationUser : IdentityUser 
{ 

    [...] 

    public virtual List<ApplicationUserGroup> UserGroups { get; set; } 
} 

public class Group 
{ 
    [Key] // *** add this attribute 
    public int GroupId { get; set; } // *** Change D to d to match ApplicationUserGroup property (this is just to be consistent in your naming conventions!) 
    [Required] 
    [StringLength(100, MinimumLength = 2)] 
    public string Name { get; set; } 

    public virtual List<ApplicationUserGroup> UserGroups { get; set; } // *** this has changed also 
} 

然後,使用流暢API來配置這些關係,你DbContext類中添加以下代碼:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<ApplicationUser>() 
      .HasMany(au => au.UserGroups) 
      .WithRequired(ug => ug.ApplicationUser) 
      .HasForeignKey(ug => ug.ApplicationUserId) 
      .WillCascadeOnDelete(false); 

    mb.Entity<Group>() 
      .HasMany(grp => grp.UserGroups) 
      .WithRequired(ug => ug.Group) 
      .HasForeignKey(ug => ug.GroupId) 
      .WillCascadeOnDelete(); 
} 

在這種情況下,添加一個用戶在一個組中,您需要在ApplicationUserGroup表中添加一條記錄,該表記錄了哪個用戶添加到哪個用戶組(使用ApplicationUserId列和GroupId列),並且添加以檢查用戶是否屬於您需要選擇ApplicationUserGroup中的所有記錄,其ApplicationUserId列與該用戶的ID相匹配。

希望這會有所幫助。