#asp.net #asp.net-mvc #asp.net-identity
#asp.net #asp.net-mvc #asp.net-identity
Вопрос:
Мой DbContext возвращает null, когда я хочу получить список пользователей в индексном представлении. Этот список взят из таблицы AspNetUsers моей базы данных, которая была сгенерирована identity. Я могу получить другой список таблиц моей базы данных.
Есть мой ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<ProductBrand> ProductBrands { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<Address> Address { get; set; }
public DbSet<Recipe> Recipes { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Order_detail> Order_Details { get; set; }
}
Есть мой UserController
[Area("Admin")]
public class UserController : Controller
{
UserManager<IdentityUser> _userManager;
private ApplicationDbContext _db;
public UserController(UserManager<IdentityUser> userManager, ApplicationDbContext db)
{
_userManager = userManager;
_db = db;
}
public IActionResult Index()
{
return View(_db.ApplicationUsers.ToList());
}
}
Есть мой ApplicationUser.Model, который наследует IdendityUser
public class ApplicationUser : IdentityUser
{
public string Name { get; set; }
public string Surname { get; set; }
public ICollection<Recipe> Products { get; set; }
public ICollection<Order> Orders { get; set; }
}
Ответ №1:
Я не знаю, как вы регистрируете ApplicationDbContext
и идентифицируете фреймворк на своем ASP.NET Основное приложение MVC, потому что вы не показали их в вопросе.
В вашем коде есть пара проблем.
Во-первых, если у вас есть пользователь IdentityUser
, подобный тому ApplicationUser
, который у вас есть, вам придется использовать общую версию IdentityDbContext
:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
...
}
Вам нужно будет использовать соответствующую универсальную версию IdentityDbContext
, если у вас есть что-либо из следующего:
- Пользовательский
IdentityUser
- Пользовательский
IdentityRole
- Пользовательский первичный ключ
- Все 7 классов, пользователь и роль, плюс
IdentityUserRole
,IdentityUserClaim
,IdentityRoleClaim
,IdentityUserLogin
, иIdentityUserToken
После того, как вы зарегистрируете свой пользовательский класс IdentityDbContext
, вам не нужно помещать этот класс в качестве одного из DbSet<>
существующих:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
...
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<ProductBrand> ProductBrands { get; set; }
public DbSet<Product> Products { get; set; }
// public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<Address> Address { get; set; }
public DbSet<Recipe> Recipes { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Order_detail> Order_Details { get; set; }
}
Вам также нужно будет использовать общую версию AddIdentity<TUser>
, AddDefaultIdentity<TUser>
, или AddIdentityCore<TUser>
в вашем Startup.cs
, в зависимости от того, что вам нужно:
AddDefaultIdentity
=AddIdentity
AddDefaultTokens
AddDefaultUI
Вы не уточнили, какая версия ASP.NET Основной идентификатор, который вы используете, поэтому я точно не знаю, какой из них вы используете, но ниже показано, как я его зарегистрировал:
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.User.RequireUniqueEmail = ...;
...
})
.AddEntityFrameworkStores<ApplicationDbContext>();
Я настроил все 7 классов, а также изменил первичный ключ с string
на Guid
.
Наконец, чтобы использовать введенную зависимость UserManager
и SignInManager
, вам также нужно будет исправить их общую версию:
[Area("Admin")]
public class UserController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public UserController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public IActionResult Index()
{
// Get the user list
var users = _userManager.Users.ToList();
// Build your view model to define what your UI only needs, not just passing
// everything to it
var vm = new UserManagementListViewModel
{
Users = users.Select(x => new UserViewModel
{
UserId = x.Id,
UserSurname = x.Surname,
ProductCount = x.Products.Count(),
OrderCount = x.Orders.Count()
})
};
return View(vm);
}
}