6

這可能只是因爲我對EF Code First流利API的知識不足,但我很難過。EF代碼優先:多對多和一對多

我想如下建模:

  • 一個收集與編號和名稱
  • 一個用戶收集與編號和名稱
  • 每個用戶都被分配到一個主組
  • 每個用戶可能有零個或多個第二組

表結構我要爲會是什麼樣子:

  • 編號
  • 名稱

用戶

  • 個編號
  • 名稱
  • PrimaryGroupId

SecondaryGroupAssignments

  • 用戶ID
  • 的GroupId

我一直在打我的頭撞牆試圖模擬這種與EF代碼第一,布我無法接受用戶和組之間的這兩種關係。對不起,沒有發佈任何.NET代碼(我很高興),但它可能都是錯的。

有沒有辦法讓EF模型呢?我假設我必須使用Fluent API進行某種配置。也許更好的問題是:Fluent API是否有很好的明確參考?

謝謝!

回答

16

試試這個(未經測試):

public class Group 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<User> PrimaryUsers { get; set; } 
    public virtual ICollection<User> SecondaryUsers { get; set; } 
} 

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int PrimaryGroupId { get; set; } 

    public virtual Group PrimaryGroup { get; set; } 
    public virtual ICollection<Group> SecondaryGroups { get; set; } 
} 

public class Context : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Group> Groups { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<User>() 
        .HasRequired(u => u.PrimaryGroup) 
        .WithMany(g => g.PrimaryUsers) 
        .HasForeignKey(u => u.PrimaryGroupId) 
        .WillCascadeOnDelete(false); 

     modelBuilder.Entity<User>() 
        .HasMany(u => u.SecondaryGroups) 
        .WithMany(g => g.SecondaryUsers) 
        .Map(m => m.MapLeftKey("UserId") 
           .MapRightKey("GroupId") 
           .ToTable("SecondaryGroupAssignments")); 
    } 
} 
+3

我可以說拉迪斯拉夫,這是我曾經有幸遇到過/用來解決我確切問題的最有用的帖子之一!謝謝! – LiverpoolsNumber9 2011-11-03 16:48:09

+0

Lad是實體框架的人,非常感謝擁有如此豐富的資源。還有一個原因是這個棧太棒了! – Sam 2012-08-12 17:46:33

3

基於拉吉斯拉夫出色的答案,這裏是如何做到這一點,而無需使用任何映射 - 只是屬性應用到模型類本身:

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

    [MaxLength(300)] 
    public string Name { get; set; } 

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

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

    [MaxLength(300)] 
    public string Name { get; set; } 

    [ForeignKey("PrimaryGroup")] 
    public int PrimaryGroupId { get; set; } 
    [Required] 
    public Group PrimaryGroup { get; set; } 

    [InverseProperty("Users")] 
    public ICollection<Group> SecondaryGroups { get; set; } 
} 

注意事項

如果需要,可以將虛擬關鍵字添加到2 ICollectionGroup。這allows lazy-loading。在性能方面,我不推薦它,但它是可能的。

我包含的MaxLength屬性的任意(但安全)長度爲300,因爲在沒有MaxLength的情況下將字符串放在EF中可以獲得低性能的NVarChar(MAX)列。完全不相關的問題,但更好地發佈好的代碼。

我建議您的EF類的類名稱爲「User」和「Group」。他們會讓你以後嘗試運行的任何SQL複雜化,必須鍵入[User]和[Group]才能訪問它們,並且在類別User將與Context屬性User衝突的MVC控制器中使用這些類會變得複雜訪問Asp.Net Identity庫。

+0

我希望我可以對此答案進行兩次投票!非常感謝Chris ... – stt106 2015-11-08 20:56:30