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框架与自定义用户实体的映射不匹配,按以下步骤修复:
修正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; } }修正Identity服务注册的泛型参数
将AddIdentity<IdentityUser, IdentityRole>改为AddIdentity<ApplicationUser, IdentityRole>,确保Identity框架使用你的自定义用户实体:builder.Services.AddIdentity<ApplicationUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true) .AddDefaultTokenProviders() .AddEntityFrameworkStores<ApplicationDbContext>();验证仓储基类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(); } }更新数据库迁移(若已生成过迁移)
重新生成迁移并更新数据库,确保Users表包含新增的Name和StreetAddress字段:Add-Migration UpdateApplicationUser Update-Database
完成以上操作后,通过仓储或工作单元即可正常获取ApplicationUser的数据。
内容的提问来源于stack exchange,提问作者Reest
相关产品推荐
相关产品推荐

