2012-01-16 45 views
6

我試圖將asp.net成員資格表連接到一個asp.mvc 3網站。我一直在Steve Sanderson的書「Pro ASP.NET MVC 3 Framework」中爲體育商店編寫教程,並將其應用於從會員exe生成的表中。在實體框架中映射連接表

所以我有一個用戶類,看起來像:

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

和上下文類,看起來像:

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

,但我得到一個錯誤,因爲我以爲它尋找之間的連接這兩個表實際上有一個連接表(aspnet_UsersInRoles),以避免多對多的連接,當我嘗試引用用戶的角色模型時,例如:

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

{ 「無效的列名稱User_UserId'。\ r \ n無效的列名 'User_UserId'。\ r \ n無效的列名稱User_UserId'。」}

是有辦法來映射該表使用連接表使用實體框架?只需添加一個新的ADO.NET實體數據模型並讓Visual Studio對數據庫進行逆向工程就更好了嗎?

+0

找到一組優秀的博客文章,涵蓋了如何在這裏操作EF:http://vincentlauzon.wordpress.com/2011/04/21/entity-framework-4- 1-bypassing-ef-query-mapping-8 /如果其他人有類似的需求 – GrahamJRoy 2012-01-23 14:46:44

回答

17

您需要自定義多對多映射如下

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

編輯:您還需要Users屬性添加到Role類。否則映射應改爲

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

你是一個傳奇人物。非常感謝這 – GrahamJRoy 2012-01-16 15:03:00

+0

嗨。是的還將用戶添加到具有公共虛擬ICollection的角色類 Users {get;組; }。再次感謝你的幫助 – GrahamJRoy 2012-01-16 15:18:56