如何在RoleProvider类中实现AddUsersToRoles方法?

问题描述

我正在开发一个简单的mvc应用程序,其中通过一个选择列表显示所有用户,并通过另一个选择列表显示所有角色。我想从用户下拉列表中选择一个用户,并从角色下拉列表中选择一个角色。我已经做了所有事情,但是我不知道如何在Role Provider类中实现AddUsersToRoles方法,而且我也没有从互联网上获得任何示例。请给我提供一个AddUsersToRoles方法的示例。我试图这样做,但它给出了一个错误,该错误不能隐式将隐式类型string []转换为int。请解决

  public override void AddUsersToRoles(string[] usernames,string[] roleNames)
    {
        EmployeeDBContext context = new EmployeeDBContext();
        UserRolesMapping userRolesMapping = new UserRolesMapping();
        
        userRolesMapping.RoleID = roleNames;
        userRolesMapping.UserID = usernames;
        context.SaveChanges();

    }

解决方法

在Microsoft的documentation上有一个实现此方法的示例。

根据使用实体框架的标签,您可能需要更改该示例的后半部分(在Odbc中)。

本质上,您需要另一个数据库表UsersInRoles来将User链接到Role。然后,在该表中为usernamesroleNames的每种组合创建一行。

-编辑:

根据您的示例,您似乎朝着正确的方向前进。但是,您正在尝试将string存储到int属性中。

我不知道您的确切模型结构,但是看起来应该像这样:

public override void AddUsersToRoles(string[] usernames,string[] roleNames)
{
    using (EmployeeDBContext context = new EmployeeDBContext())
    {
        if (context.UsersInRoles == null)
        {
            context.UsersInRoles = new List<UserRolesMapping>();
        }

        foreach (string username in usernames)
        {
            foreach (string roleName in roleNames)
            {
                if(IsUserInRole(username,roleName)) continue;

                UserRolesMapping userRoleMapping = new UserRolesMapping();
                userRoleMapping.Role = roleNames;
                userRoleMapping.User = usernames;

                context.UsersInRoles.Add(userRoleMapping);
            }
        }

        context.SaveChanges();
    }
}

private static bool IsUserInRole(string username,string roleName)
{
    using (EmployeeDBContext context = new EmployeeDBContext())
    {
        var userRole = context.UsersInRoles.FirstOrDefault(x => x.User == username && x.Role == roleName);
        return userRole != null;
    }
}

请注意,您需要进行其他代码更改才能完成此工作,即,本示例中的RoleUserstring,而不是int