Identity ASP.NET - IdentityDBContext вызывает проблемы для полей, добавленных в таблицу Aspnetroles
-
21-12-2019 - |
Вопрос
identitydbcontext, вызывая проблемы для свойств / полей, добавленных в аспектреолы
Я считаю, что проблема здесь с идентификаторомDBContext, принимая тип идентификатора:
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public IdentityDb()
: base("IdentityDb")
{
}
}
.
Но позвольте мне объяснить ...
Прекрасно, что мы можем добавлять поля в таблицу ASPTESUSERS, добавив свойства на наш класс приложения, который наследует от идентификатора. Пример:
public class ApplicationUser : IdentityUser
{
[Required]
[StringLength(50)]
public string FirstName { get; set; }
[Required]
[StringLength(50)]
public string LastName { get; set; }
}
.
Так что натурально мы можем добавлять поля в таблицу Aspnetroles, добавляя свойства в класс Applicationrole, который наследует от идентификатора. Пример:
public class ApplicationRole : IdentityRole
{
[Required]
[StringLength(50)]
public string ProperName { get; set; }
}
.
работает идеально. Мы можем увидеть поле в базе данных. Мы можем добавить данные к нему. Пример:
RoleManager<ApplicationRole> roleManager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new MyIdentityDb()));
var role = new ApplicationRole() { Name = name, ProperName = propername };
var result = await roleManager.CreateAsync(role);
.
Но теперь мы столкнулись с проблемой при попытке добраться до данных. Пример:
Наш ViewModel:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<ApplicationRole> Roles { get; set; }
}
.
на нашем контроллере:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
.
Наш метод индекса на нашем контроллере:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityDb.Roles.ToList()
});
}
.
ошибка включена на "my indoletitydb.rolose.tolist ()" и чтение "не может неясно преобразовать тип System.Collection.Generic.List<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> to System.Collections.Generic.IList<MyApp.Models.ApplicationRole>
...
Конечно, мы могли бы изменить наш ViewModel, чтобы использовать тип идентификатора типа, как следующий пример, но тогда мы не можем добраться до нового поля «Opername» в таблице Aspnetroles:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<IdentityRole> Roles { get; set; }
}
.
Итак, мы могли бы попробовать создать другой класс БД и передавать его идентификаторным типом вместо идентификатора:
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public MyIdentityDb()
: base("MyIdentityDb")
{
}
}
public class MyIdentityRolesDb : IdentityDbContext<ApplicationRole>
{
public MyIdentityRolesDb()
: base("MyIdentityDb")
{
}
}
.
и изменить наш контроллер:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
private MyIdentityRolesDb myIdentityRolesDb = new MyIdentityRolesDb();
.
и изменить наш метод индекса на нашем контроллере:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityRolesDb.Roles.ToList()
});
}
.
Но мы в конечном итоге с той же проблемой; Тот факт, что идентификаторDBContext принимает тип идентификатора.
Решение
Так что, если вы обновляете до бета-пакетов 2.0.0, вы должны быть в состоянии получить IQueryable ApplicationRole непосредственно из руководителя роли:
roleManager.Roles
.
Так что вам не нужно выпадать в контекст БД, это было ограничение в 1.0, которое было зафиксировано в выпуске 2.0.
Другие советы
Пожалуйста, посмотрите на следующую статью, которая подробно объясняет, что вы пытаетесь сделать http://typecastexception.com/post/2014/02/13/aspnet-mvc-5-identity-extended-and-modifying-roles.aspx