2011-11-08 63 views
5

嗨我試圖爲用戶和角色之間的多對多關係設置實體框架。實體框架用戶角色多對多關係

下圖顯示了在數據庫:

Many to Many relationships

用戶的型號是:

public class User : IEntity 
    { 
     public virtual int UserId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string UserName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string FirstName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string LastName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(200)] 
     public virtual string EmailAddress { get; set; } 
     public int AreaId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation properties 
     //public virtual Role Role { get; set; } 
     public virtual Area Area { get; set; } 

     public virtual ICollection<Role> Roles { get; set; } 

} 

的榜樣是:

public class Role : IEntity 
    { 
     public int RoleId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public string Name { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(1000)] 
     public string Description { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation Properties 
     public ICollection<User> Users { get; set; } 
    } 

UserRole的是:

public class UserRole 
    { 
     public int UserId { get; set; } 
     public int RoleId { get; set; } 

     //Navigation properties 
     public virtual User User { get; set; } 
     public virtual Role Role { get; set; } 
    } 

所以我想我有這個成立了罰款,但在我的代碼,我去類似:

var roles = from r in user.Roles 
         select r.Name; 

,並拍攝本身給人的錯誤:

Server Error in '/' Application. 
Invalid object name 'dbo.RoleUser'. 

,所以我增加了以下上下文:的

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<User>() 
       .HasMany(i => i.Roles) 
       .WithMany(u => u.Users); 

} 

但是現在我得到錯誤:

'/'應用程序中的服務器錯誤。 列名稱'Role_RoleId'無效。 列名'User_UserId'無效。

所以當然,我沒有在這裏正確設置的東西。我的身體可以指向正確的方向嗎?

回答

9

您不需要將鏈接表UserRole建模爲類,因爲它只有表中的主鍵參與關係。所以刪除UserRole類。

如果您要爲現有數據庫建模,EF可能會推斷鏈接表名稱爲RoleUser。爲避免這種情況,您可以按如下方式配置鏈接表。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<User>() 
      .HasMany(i => i.Roles) 
      .WithMany(u => u.Users) 
      .Map(m => 
      { 
       m.ToTable("UserRole"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 

} 
+0

角色實體如何不知道用戶實體?如何編寫配置代碼? –