CustomRoleProvider: Работа с AddUsersToRoles - PullRequest
0 голосов
/ 20 февраля 2012

Мне трудно понять, как работать с двумя строковыми массивами, переданными в AddUsersToRoles.

Вот что мне нужно сделать:

  • Сначала получите int UserID для строки [] usernames.
  • Затем получите int RoleID для роли string [].
  • Конкат двух массивов вместе.
  • Сохранение данных в UserRole (база данных, которая содержит 3 столбца: UserRoleID, UserID, RoleID).

Вот как это выглядит:

//override and implement a custom 'adduserstoroles' from the abstract method in RoleProvider</p> <pre><code> public override void AddUsersToRoles(string[] usernames, string[] roleNames) { int[] userid; foreach(var username in usernames) { User user = AuthRepository.GetUser(username); //Error 1: An object reference is required for the non-static field, method, or property 'CustomAuth.AuthRepository.GetUser(string)' userid = user.ID; //Error 2: Cannot implicitly convert type 'int' to 'int[]' } int[] roleid; foreach(var rolename in roleNames) { Role role = db.Roles.Where(r => r.RoleName == rolename).SingleOrDefault(); roleid = role.RoleID; //Error 3: Cannot implicitly convert type 'int' to 'int[]' } var userroles = userid.Concat(roleid).ToArray(); foreach(var userrole in userroles) { UserRole userRole = new UserRole(); db.UserRoles.Add(userRole); } }

Так вот, я не знаю, ухожу ли я из глубины этого. Я искал примеры того, как другие справились с этим, но я не могу найти ответы.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

для ошибок 2 и 3 вы пытаетесь присвоить простой старый int массиву целых чисел, что не имеет никакого смысла. Вы, вероятно, просто хотите создать идентификатор пользователя из идентификаторов пользователя и ролей

List<int> roleid = new List<int>();

Тогда в циклах foreach вы можете просто

roleid.Add(user.ID);

и

для ошибки 1 похоже, что AuthRepository не является статическим классом, поэтому вам необходимо создать его экземпляр перед использованием.

foreach (var username in usernames) 
{
    AuthRepository repository = new AuthRepository();
    repository.GetUser(username);
    ...
}
1 голос
/ 20 февраля 2012

Прежде всего, я создаю бесплатное i для отслеживания того, как далеко вы проходите через массив, затем измените foreach на:

int[] userid = new int[usernames.length];
i=0;
    foreach(string username in usernames)
    {
        User user = AuthRepository.GetUser(username);

        userid[i] = user.ID;
        i++;
    }
int[] roleid = new int[...];
i = 0;

Таким образом, вы заполните массив userid, чтобы он соответствовал массиву имени пользователя. (и то же самое для роли)

Вы уверены, что concat - это то, что вы хотите? Не лучше ли объявить 2d массив

int [,] role = new ...

затем заполните его, поскольку concat просто добавляет два массива вместе, чтобы у вас был намного более длинный массив.


редактирование:

concat возьмет второй массив и добавит его в конец первого, создавая более длинный массив, поэтому, если у вас есть массивы:

userid[1,2,3]
roleid[7,8,9]

затем userid.concat (roleid). ToArray даст вам более длинный массив result = int [6] {1,2,3,7,8,9} Что, вероятно, не то, что вы хотите.

Я бы использовал списки, мне нравятся списки. И тогда я бы создал ваш класс userRole, в котором, предположительно, есть 3 целых числа (для UserRoleid, Roleid и userid), затем я бы повторил цикл со счетчиком и использовал его для создания вашего userRole и добавления его в базу данных. :

UserRole userRole;
i = 0;
foreach(int id in userid)
{
     userRole = new UserRole();
     userRole.id = i;                 // Note this line and the next two could be done 
     userRole.user = id;              // in the constructor, passing i, id, roleid[i]
     userRole.role = roleid[i];        
     db.UserRoles.Add(userRole);
     i++;
}

хотя я не уверен, как настроена база данных, поэтому не знаю, сработает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...