我正在尝试将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)以避免多对多的链接,当我尝试从用户引用Role模型时,如:
var test = _repository.Users.FirstOrDefault().Roles.Count();
{“Invalid column name ‘User_UserId’.\r\nInvalid column name
‘User_UserId’.\r\nInvalid column name ‘User_UserId’.”}
有没有办法使用实体框架使用连接表将表映射到一起?添加新的ADO.NET实体数据模型并让visual studio对数据库进行逆向工程更好吗?
解决方法
您需要自定义多对多映射,如下所示
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"); });