实体框架用户角色多对多关系

Ano*_*use 5 entity-framework

嗨,我正在尝试为用户和角色之间的多对多关系设置我的实体框架.

下图显示了数据库中的内容:

多对多关系

用户模型是:

public class User : IEntity
    {
        public virtual int UserId { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(100)]
        public virtual string UserName { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(100)]
        public virtual string FirstName { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(100)]
        public virtual string LastName { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(200)]
        public virtual string EmailAddress { get; set; }
        public int AreaId { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(64)]
        public string CreatedByUserName { get; set; }
        public DateTime CreatedDateTime { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(64)]
        public string LastModifiedByUserName { get; set; }
        public DateTime? LastModifiedDateTime { get; set; }

        //Navigation properties
        //public virtual Role Role { get; set; }
        public virtual Area Area { get; set; }

        public virtual ICollection<Role> Roles { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

角色模型是:

public class Role : IEntity
    {
        public int RoleId { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(100)]
        public string Name { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(1000)]
        public string Description { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(64)]
        public string CreatedByUserName { get; set; }
        public DateTime CreatedDateTime { get; set; }
        [Column(TypeName = "varchar")]
        [StringLength(64)]
        public string LastModifiedByUserName { get; set; }
        public DateTime? LastModifiedDateTime { get; set; }

        //Navigation Properties
        public ICollection<User> Users { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

UserRole是:

public class UserRole
    {
        public int UserId { get; set; }
        public int RoleId { get; set; }

        //Navigation properties
        public virtual User User { get; set; }
        public virtual Role Role { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

所以我认为我设置得很好,但在我的代码中我做了类似的事情:

var roles = from r in user.Roles
                        select r.Name;
Run Code Online (Sandbox Code Playgroud)

并且它自己发出错误:

Server Error in '/' Application.
Invalid object name 'dbo.RoleUser'. 
Run Code Online (Sandbox Code Playgroud)

所以我在上下文中添加了以下内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>()
                .HasMany(i => i.Roles)
                .WithMany(u => u.Users);

}
Run Code Online (Sandbox Code Playgroud)

但是现在我得到的错误是:

'/'应用程序中的服务器错误.列名称"Role_RoleId"无效.列名称"User_UserId"无效.

所以我肯定没有正确设置这里的东西.安妮可以指出我正确的方向吗?

Era*_*nga 9

您不需要将链接表建模UserRole为类,因为它只有表的主键参与关系.所以删除UserRole该类.

如果要对现有数据库建模,EF可能会推断出链接表名称RoleUser.为避免这种情况,您可以按如下方式配置链接表.

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
        modelBuilder.Entity<User>()
            .HasMany(i => i.Roles)
            .WithMany(u => u.Users)
            .Map(m =>
            {
                m.ToTable("UserRole");
                m.MapLeftKey("UserId");
                m.MapRightKey("RoleId");
            });

 }
Run Code Online (Sandbox Code Playgroud)