将角色分配给用户会导致在数据库中创建新角色



我有这个

  [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Create(UserNew form)
    {
        var user = new User();
        SyncRoles(form.Roles, user.Roles);
        if (db.Users.Any(u => u.username == form.username))
        {
            ModelState.AddModelError("Username", "Username must be unique");
        }
        if (ModelState.IsValid)
        {
            user.username = form.username;
            user.email = form.email;                 
            user.SetPassword(form.password);
            db.Users.Add(user);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(form);
    }

,使用此功能,我正在尝试以表格检查哪些复选框,并将检查的角色分配给用户:

 private void SyncRoles(IList<RoleCheckbox> checkboxes, IList<Role> roles)
    {
        var selectedRoles = new List<Role>();
        RolesContext rdb = new RolesContext();

        List <Role> roleList = new List<Role>();
        roleList = rdb.Roles.ToList();

        foreach (var role in roleList)
        {
            var checkbox = checkboxes.Single(c => c.roleId == role.roleId);
            checkbox.roleName = role.roleName;
            if (checkbox.IsChecked)
                selectedRoles.Add(role);
        }
        foreach (var toAdd in selectedRoles.Where(t => !roles.Contains(t)))
        {
            roles.Add(toAdd);
        }
        foreach (var toRemove in roles.Where(t => !selectedRoles.Contains(t)).ToList())
        {
            roles.Remove(toRemove);
        }
    }

当我尝试创建用户时,我选择角色" admin"(数据库中存在具有ID = 1的数据库),在数据库中,我在角色表中获得了一个新字段,上面有名称为" admin"但是一个不同的ID。有人可以帮我了解我在做什么错吗?

public class User
{
    [HiddenInput(DisplayValue = false)]
    public int userId { get; set; }
    [Required]
    [StringLength(128)]
    public string username { get; set; }
    [Required, DataType(DataType.EmailAddress)]
    [StringLength(256)]
    public string email { get; set; }
    [Required]
    [StringLength(128)]
    public string password_hash { get; set; }
    public virtual IList<Role> Roles { get; set; }
    public User()
    {
        Roles = new List<Role>();
    }
    public void SetPassword(string password)
    {
        password_hash = BCrypt.Net.BCrypt.HashPassword(password, 14);
    }
    public virtual bool CheckPassword(string password)
    {
        return BCrypt.Net.BCrypt.Verify(password, password_hash);
    }        
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .Property(e => e.username)
            .IsUnicode(false);
        modelBuilder.Entity<User>()
            .Property(e => e.email)
            .IsUnicode(false);
        modelBuilder.Entity<User>()
            .Property(e => e.password_hash)
            .IsUnicode(false);
        modelBuilder.Entity<User>().HasMany(r => r.Roles).WithMany().Map(m =>
               {
                   m.ToTable("role_users");
                   m.MapLeftKey("user_Id");
                   m.MapRightKey("role_Id");
               });
    }

我想添加评论,但只有在50多个声誉之后才有可能。从我在代码中看到的内容,您可以将角色分配给MVC的用户,然后直接发送给EF,这引导您在数据库中的重复项上。您应该更改逻辑,并在成功创建用户后,应该使用UserManager类将用户添加到角色:

UserManager.AddToRole(user.Id, role.Name);

在数据库中检查角色的位置。如果您尚未在数据库中找到角色,则应使用IdentityRol E Class

创建它

最新更新