Метод AddToRole() не приводит к записи базы данных в ASP.NET Идентичность

#c# #asp.net #asp.net-mvc #roles #asp.net-identity

#c# #asp.net #asp.net-mvc #роли #asp.net-identity

Вопрос:

Я использую ASP.NET Идентичность в моем ASP.NET Приложение MVC. Моя проблема возникает при добавлении пользователя в роль. Нет никакого исключения, но в результате единой системы обмена сообщениями.AddToRole() запись базы данных не добавляется в таблицу AspNetUserRoles. Мой метод действия выглядит так:

     public ActionResult GrantAdmin(string id)
    {
        ApplicationUser user = um.FindById(id);
        if (!rm.RoleExists("admin")) 
        {
            rm.Create(new IdentityRole("admin"));
        }
        um.AddToRole(user.Id, "admin");
        return View((object)user.UserName);
    }
  

um является объектом класса UserManager:

 private UserManager<ApplicationUser> um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
  

Что может быть причиной такого поведения приложения? Есть идеи?

=== РЕДАКТИРОВАТЬ === Это мой DbContext:

 public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
  

И подключение по умолчанию в Web.config:

 <add name="DefaultConnection" connectionString="Data Source=(LocalDb)v11.0;AttachDbFilename=|DataDirectory|aspnet-RecommendationPlatform-20140404055015.mdf;Initial Catalog=aspnet-RecommendationPlatform-20140404055015;Integrated Security=True" providerName="System.Data.SqlClient" />
  

Комментарии:

1. Это может показаться странным вопросом — хотя обновляли ли вы список баз данных в SQL Management Studio после запуска этого? Есть вероятность, что он просматривал другую БД, отличную от той, которую вы намеревались, и если ее там не было, он создал ее и добавил пользователя / роль в эту. Я упоминаю об этом только потому, что это случилось и со мной.

2. Да, я учитывал эту возможность. Но я вообще не вижу его там. Отсутствие записей без исключения предполагает, что записи выполняются в другом месте… Но я понятия не имею, почему он так себя ведет и как я могу явно указать правильную базу данных @Darren. Как вы решили эту проблему?

3. Можете ли вы показать код, в котором вы создаете свой DbContext? здесь вы должны явно указать имя строки подключения, которую вы хотите использовать.

4. @Darren это показано во второй части моего кода. Когда я создаю объект UserManager (um) — параметром в хранилище пользователей является new ApplicationDbContext() .

5. AddToRole возвращает результат IIRC. Можете ли вы проверить объект результата, возможно, ответ есть.

Ответ №1:

При работе с ASP.NET Идентификация важно помнить, что многие операции возвращают результирующий объект, в котором хранятся возможные ошибки. Исключений нет. Поэтому следует проверять результирующий объект на успешность после каждой операции. Это верно не только для ролей, но и для большинства методов, которые сохраняют данные в базе данных. Даже если это сработает, вы все равно должны выполнить успешную проверку и в конечном итоге выдать исключение, если результат не будет успешным.

Согласно комментариям в вашем случае проблема заключалась в недопустимом имени пользователя.

Комментарии:

1. Кроме того, ошибки возвращаются в виде строк. Если вы согласны с тем, что они должны быть перечислениями, чтобы было легче узнать все возможные ошибки и легче с ними справиться, пожалуйста, поддержите проблему, которую я опубликовал на codeplex — aspnetidentity.codeplex.com/workitem/2222