You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asp.Net Core 6中扩展Identity User无法获取数据问题求助

问题:.NET Core 6扩展IdentityUser后,仓储/工作单元无法获取用户数据

我在.NET Core 6中采用工作单元(Unit of Work)、仓储模式及内置依赖注入搭建网站,其他实体可通过工作单元正常获取数据库数据,但通过继承IdentityUser实现ApplicationUser扩展Asp.Net Users表字段后,调用以下代码返回的users和users2均为null:

var users = _userRepository.GetAll().ToList();
var users2 = _unitOfWork.ApplicationUsers.GetAll();

相关代码实现

HomeController代码

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly IUnitOfWork _unitOfWork;
    private IApplicationUserRepository _userRepository;

    public HomeController(ILogger<HomeController> logger, IUnitOfWork unitOfWork, IApplicationUserRepository userRepository)
    {
        _logger = logger;
        _unitOfWork = unitOfWork;
        _userRepository = userRepository;
    }

    public IActionResult Index()
    {
        var users = _userRepository.GetAll().ToList();
        return View(users);
    }
}

ApplicationDbContext及ApplicationUser代码

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
       : base(options)
    {}
    public DbSet<ApplicationUser> ApplicationUsers { get; set; }
}

public class ApplicationUser : IdentityUser
{
    [Required]
    public string Name { get; set; }
    public string? StreetAddress { get; set; }
}

仓储及工作单元代码

public class ApplicationUserRepository : Repository<ApplicationUser>, IApplicationUserRepository
{
    private readonly ApplicationDbContext _db;
    public ApplicationUserRepository(ApplicationDbContext db):base(db)
    {
        _db = db;
    }
}
public interface IApplicationUserRepository : IRepository<ApplicationUser>
{
}

public interface IUnitOfWork
{
    IApplicationUserRepository ApplicationUsers { get; }
}

public class UnitOfWork : IUnitOfWork
{
    private ApplicationDbContext _db;
    public IApplicationUserRepository ApplicationUsers { get; private set; } 

    public UnitOfWork(ApplicationDbContext db)
    {
        _db = db;
        ApplicationUsers = new ApplicationUserRepository(_db);
    }
}

服务注册代码

builder.Services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddDefaultTokenProviders()
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IApplicationUserRepository, ApplicationUserRepository>();

builder.Services.AddDbContextPool<ApplicationDbContext>(options => options.UseSqlServer(connectionString));

解决方案

问题核心是Identity框架与自定义用户实体的映射不匹配,按以下步骤修复:

  1. 修正ApplicationDbContext的继承泛型
    将IdentityDbContext改为IdentityDbContext<ApplicationUser>,让EF Core明确使用自定义用户实体映射到Users表:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
           : base(options)
        {}
        // 可保留DbSet<ApplicationUser>,但IdentityDbContext已内置对用户实体的DbSet,并非必须
        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
    }
    
  2. 修正Identity服务注册的泛型参数
    将AddIdentity<IdentityUser, IdentityRole>改为AddIdentity<ApplicationUser, IdentityRole>,确保Identity框架使用你的自定义用户实体:

    builder.Services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
  3. 验证仓储基类Repository的GetAll实现
    确认Repository<T>基类的GetAll()方法正确返回实体集合,示例实现:

    public class Repository<T> : IRepository<T> where T : class
    {
        protected readonly ApplicationDbContext _db;
        public Repository(ApplicationDbContext db)
        {
            _db = db;
        }
    
        public IEnumerable<T> GetAll()
        {
            return _db.Set<T>().ToList();
        }
    }
    
  4. 更新数据库迁移(若已生成过迁移)
    重新生成迁移并更新数据库,确保Users表包含新增的Name和StreetAddress字段:

    Add-Migration UpdateApplicationUser
    Update-Database
    

完成以上操作后,通过仓储或工作单元即可正常获取ApplicationUser的数据。

内容的提问来源于stack exchange,提问作者Reest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:55:19