c# - 在 Entity Framework 中映射连接表

标签 c# entity-framework-4 asp.net-membership

我正在尝试将 asp.net 成员表连接到 asp.mvc 3 网站。我一直在关注 Steve Sanderson 的书“Pro ASP.NET MVC 3 Framework”中针对体育商店的教程,并将其应用于从成员(member) 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();

{"Invalid column name 'User_UserId'.\r\nInvalid column name 'User_UserId'.\r\nInvalid column name 'User_UserId'."}

有没有办法使用 Entity Framework 使用连接表将表映射在一起?是不是只添加一个新的 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");
            });

关于c# - 在 Entity Framework 中映射连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8881387/

相关文章:

C# 如何在我的 Windows 窗体应用程序中的字符串内部进行一些基本数学运算

entity-framework - Entity Framework - 更新异常

c# - DbContext 和 ObjectContext 之间不同的 setter 行为

c# - MembershipUser 和 Entity Framework 代码优先

c# - 为任意参数可以为空的两个表选择记录

c# - 有没有一种方法可以在 TreeView.Nodes 集合中搜索 TreeNode.Text 字段?

c# - 表达式不能包含 lambda 表达式

asp.net - 表单例份验证适用于开发服务器,但不适用于生产服务器(相同的 SQL 数据库)

ruby-on-rails - 像Devise for Rails这样的ASP.Net MVC的身份验证引擎?

c# - 带有 vNext 的 SignalR