2

我正在努力解決一個問題,並從我所見過的解決方案中找不到任何解決方案。如何使用ADO.NET實體框架代碼優先創建一對多關係?

基本上我有兩類:

public class Role 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

public class ActionType 
{ 
    public int ID { get; set;} 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Role> AllowedRoles { get; set; } 

    public ActionType() 
    { 
     this.AllowedRoles = new List<Role>(); 
    } 
} 

我想爲EF強制的關聯表在DB,其中FK用於引用的一對多關係。不知何故代碼首先爲我的Role創建了一個表,其中添加了一列ActionType_ID。當然,當更多的Role被添加到一個ActionType時沒有用。正在播放一個DBUpdateExcpetion

有關我該如何解決這個問題的任何想法?問題在於類角色沒有引用ActionType,因爲這沒有用。

謝謝!

回答

1

你真的想做什麼?目前,您可以將更多Role s添加到單個ActionType,但單個Role不能添加到多個ActionType s。你也想要嗎?

在這種情況下,您並沒有進行一對多的關聯,而是進行多對多的關聯。只有多對多關係使用聯結(關聯)表。一對多關係實際上意味着依賴實體(多方關係實體)將FK作爲主體。最簡單的方法是在角色定義導航屬性,以及:

public class Role 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<ActionType> ActionTypes { get; set; } 
} 

public class ActionType 
{ 
    public int ID { get; set;} 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Role> AllowedRoles { get; set; } 
} 

如果你不希望有導航屬性的角色,你必須使用流暢API來描述的關係。

public class Context : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<ActionType>() 
        .HasMany(a => a.AllowedRoles) 
        .WithMany(); 
    } 
} 
+0

謝謝你,最後提出的方案就像一個魅力。似乎我不得不在這個流利的API中潛水。 – cecemel 2012-01-13 17:10:38

相關問題