2011-11-08 36 views
5

Xin chào, tôi đang cố gắng thiết lập khung thực thể của mình cho mối quan hệ nhiều đến nhiều giữa Người dùng và Vai trò.Khuôn khổ thực thể Vai trò người dùng Nhiều mối quan hệ

Bức tranh dưới đây cho thấy những gì trong cơ sở dữ liệu:

Many to Many relationships

Mô hình cho User là:

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; } 

} 

Mô hình Vai trò là:

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 là:

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; } 
    } 

Vì vậy, tôi nghĩ rằng tôi đã này thiết lập tốt nhưng trong mã của tôi, tôi đi một cái gì đó như:

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

và nó bắn tự cho lỗi của:

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

vì vậy tôi thêm như sau theo ngữ cảnh:

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

} 

Tuy nhiên, bây giờ tôi gặp lỗi:

Lỗi máy chủ trong ứng dụng '/'. Tên cột không hợp lệ 'Role_RoleId'. Tên cột không hợp lệ 'User_UserId'.

Vì vậy, chắc chắn tôi không có thiết lập nào ở đây chính xác. Có thể andybody chỉ cho tôi đi đúng hướng?

Trả lời

9

Bạn không cần lập mô hình bảng liên kết UserRole làm lớp vì nó chỉ có khóa chính của các bảng tham gia vào mối quan hệ. Vì vậy, hãy xóa lớp học UserRole.

Nếu bạn đang lập mô hình cơ sở dữ liệu hiện có, EF có thể phỏng đoán tên bảng liên kết là RoleUser. Để tránh điều này, bạn có thể cấu hình bảng liên kết như sau.

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

Trường hợp tổ chức Vai trò không biết thực thể Người dùng thì sao? Làm thế nào để viết mã cấu hình? –

Các vấn đề liên quan