2012-01-16 36 views
6

Tôi đang cố kết nối các bảng thành viên asp.net vào trang web asp.mvc 3. Tôi đã làm theo hướng dẫn trong cuốn sách 'Pro ASP.NET MVC 3 Framework' của Steve Sanderson cho cửa hàng thể thao và áp dụng điều này cho các bảng được tạo ra từ các thành viên exe.Ánh xạ tham gia các bảng trong khung thực thể

Vì vậy, tôi có một lớp người dùng mà trông giống như:

namespace Domain.Entities 
{ 
    public class User 
    { 
     public Guid UserId { get; set; } 
     public string UserName { get; set; } 
     public DateTime LastActivityDate; 
     public virtual ICollection<Role> Roles { get; set; } 
    } 

    public class Role 
    { 
     public Guid RoleId { get; set; } 
     public string RoleName { get; set; } 
    } 
} 

và một lớp bối cảnh đó trông giống như:

public class EFDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("aspnet_users"); 
     modelBuilder.Entity<Role>().ToTable("aspnet_roles"); 
    } 
} 

nhưng tôi nhận được một lỗi vì tôi cho rằng nó đang tìm kiếm một gia nhập giữa hai bảng này khi thực tế có một bảng kết nối (aspnet_UsersInRoles) ở giữa để tránh liên kết nhiều đến nhiều, khi tôi thử và tham khảo mô hình Vai trò từ Người dùng, chẳng hạn như:

var test = _repository.Users.FirstOrDefault().Roles.Count(); 

{ "Tên không hợp lệ cột 'User_UserId'. \ R \ nInvalid tên cột 'User_UserId'. \ R \ nInvalid tên cột 'User_UserId'."}

là có một cách để lập bản đồ bảng với nhau bằng cách sử dụng bảng tham gia bằng cách sử dụng khung thực thể? Là nó tốt hơn chỉ để thêm một mô hình dữ liệu thực thể ADO.NET mới và để cho phòng thu trực quan chỉ cần đảo ngược kỹ sư cơ sở dữ liệu?

+0

tìm thấy một bộ bài đăng blog tuyệt vời bao gồm cách thao tác EF tại đây: http://vincentlauzon.wordpress.com/2011/04/21/entity-framework-4- 1-bỏ qua-ef-truy vấn-bản đồ-8/trong trường hợp bất cứ ai khác có nhu cầu tương tự – GrahamJRoy

Trả lời

17

Bạn cần phải tùy chỉnh nhiều để nhiều bản đồ như sau

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("aspnet_users"); 
     modelBuilder.Entity<Role>().ToTable("aspnet_roles"); 

     modelBuilder.Entity<User>() 
     .HasMany(u => u.Roles).WithMany(r => r.Users) 
      .Map(m => 
      { 
       m.ToTable("aspnet_UsersInRoles"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 
    } 

Edit: Bạn cũng sẽ cần phải thêm Users tài sản cho lớp Role. Nếu không, ánh xạ phải được đổi thành

 modelBuilder.Entity<User>() 
     .HasMany(u => u.Roles).WithMany() 
      .Map(m => 
      { 
       m.ToTable("aspnet_UsersInRoles"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 
+0

bạn là một huyền thoại. cảm ơn rất nhiều vì điều này – GrahamJRoy

+0

Xin chào. cũng đã thêm Người dùng vào lớp Vai trò với ICollection ảo công khai Người dùng {get; bộ; }. Cảm ơn một lần nữa vì sự giúp đỡ của bạn – GrahamJRoy

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