#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