在实体框架中映射联接表

本文关键字:映射 实体 框架 | 更新日期: 2023-09-27 18:20:38

我正在尝试将中的asp.net成员表连接到asp.mvc 3网站。我一直在学习Steve Sanderson的书《Pro ASP.NET MVC 3 Framework》中关于体育商店的教程,并将其应用于从membership 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实体数据模型,让visualstudio对数据库进行逆向工程,这样更好吗?

在实体框架中映射联接表

您需要自定义如下所示的多对多映射

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