Мой DbContext возвращает null, когда я хочу получить список пользователей, которые являются идентификаторами

#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);
    }
}