如何在继承IdentityDbContext的类中使用实体配置?
问题分析与解决方案
嘿,我一眼就看出你遇到的核心问题是混用了Entity Framework Core(EF Core)和传统Entity Framework(EF6)的Identity组件,这也是你改完ApplicationDbContext后错误层出不穷的根源。咱们一步步拆解解决:
核心错误点
你原来的代码是基于EF Core(引用的是Microsoft.EntityFrameworkCore),但修改成IdentityDbContext时,错误地引用了EF6的包(Microsoft.AspNet.Identity.EntityFramework和System.Data.Entity)。这两个框架的API完全不兼容:
- EF Core用的是
ModelBuilder,而EF6是DbModelBuilder,你原来的ApplyConfiguration是EF Core专属方法,EF6里根本没有,所以会直接失效。 - EF Core依赖
DbContextOptions<T>构造函数注入配置,而你删掉它后,EF Core无法正确初始化上下文。
修复后的正确代码
首先确保你安装了EF Core对应的Identity包:Microsoft.AspNetCore.Identity.EntityFrameworkCore(如果没装,用NuGet包管理器安装)。然后修改你的ApplicationDbContext如下:
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using ProjectKiwi.Data.Mappers; using ProjectKiwi.Models.Domain; namespace ProjectKiwi.Data { // 若使用默认Identity用户,直接用IdentityDbContext即可;若自定义用户类,替换为IdentityDbContext<YourCustomUser> public class ApplicationDbContext : IdentityDbContext { // 保留你所有原有实体的DbSet public DbSet<Nieuwsartikel> Artikels { get; set; } public DbSet<Bestuurslid> Bestuurleden { get; set; } public DbSet<Locatie> Locaties { get; set; } public DbSet<ContactPagina> ContactPaginas { get; set; } public DbSet<Spreker> Sprekers { get; set; } public DbSet<Seminarie> Seminaries { get; set; } public DbSet<Categorie> Categories { get; set; } public DbSet<Deelnemer> Deelnemers { get; set; } public DbSet<Inschrijving> Inschrijvingen { get; set; } public DbSet<Organisatie> Organisaties { get; set; } public DbSet<Forumpost> Forumposts { get; set; } // 必须保留这个构造函数,EF Core依赖它注入数据库配置 public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { // 先调用base方法,让Identity自动配置用户、角色等表 base.OnModelCreating(builder); // 再应用你自己的实体映射配置,此时ApplyConfiguration就能正常工作了 builder.ApplyConfiguration(new ArtikelConfiguration()); builder.ApplyConfiguration(new BestuurslidConfiguration()); builder.ApplyConfiguration(new LocatieConfiguration()); builder.ApplyConfiguration(new ContactPaginaConfiguration()); builder.ApplyConfiguration(new CategorieConfiguration()); builder.ApplyConfiguration(new DeelnemerConfiguration()); builder.ApplyConfiguration(new InschrijvingConfiguration()); builder.ApplyConfiguration(new OrganisatieConfiguration()); builder.ApplyConfiguration(new SeminarieConfiguration()); } } }
额外注意事项
- 清理冲突包:检查你的NuGet包列表,卸载掉
Microsoft.AspNet.Identity.EntityFramework和System.Data.Entity这些EF6相关的包,只保留EF Core系列的包(比如Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer等,根据你的数据库类型选择)。 - 自定义用户扩展:如果需要给用户表添加额外字段(比如姓名、手机号),可以创建一个
ApplicationUser类继承IdentityUser,然后把IdentityDbContext改成IdentityDbContext<ApplicationUser>,同时更新Startup里的身份认证配置。 - 迁移更新:修改完上下文后,记得生成新的EF迁移并更新数据库,确保Identity的表(AspNetUsers、AspNetRoles等)被正确创建。
内容的提问来源于stack exchange,提问作者Ruben Szekér
相关产品推荐
相关产品推荐

