.NET Core 2.1:基于Code First为现有数据库集成Identity用户与角色
问题解答
1. 完全可以将Identity集成到现有DbContext中,这是更推荐的方案
没必要单独维护两个DbContext,直接把Identity的表整合到你已有的数据库上下文里就行,步骤很简单:
- 修改你的现有DbContext,让它继承
IdentityDbContext(如果需要自定义用户实体,就继承IdentityDbContext<YourCustomUser>),示例代码如下:
// 假设你的现有DbContext名为AppDbContext public class AppDbContext : IdentityDbContext { // 保留你原有的业务实体DbSet public DbSet<Product> Products { get; set; } public DbSet<Order> Orders { get; set; } // 保留原有的构造函数 public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } }
- 在配置文件(Startup.cs/.NET 6+的Program.cs)里注册Identity服务,并指定使用你的现有DbContext:
// .NET 5及更早版本在Startup.cs的ConfigureServices方法中 services.AddDefaultIdentity<IdentityUser>() .AddEntityFrameworkStores<AppDbContext>(); // .NET 6+在Program.cs中 builder.Services.AddDefaultIdentity<IdentityUser>() .AddEntityFrameworkStores<AppDbContext>();
- 最后通过EF迁移把Identity的表添加到现有数据库:
Add-Migration AddIdentityTablesToExistingDb Update-Database
执行完这两步,AspNetUsers、AspNetRoles等Identity相关表就会自动创建到你的现有数据库里。
2. 若坚持使用独立AccountDbContext(同一数据库),用EF迁移替代EnsureCreated()创建身份表
EnsureCreated()的逻辑是仅当数据库完全不存在时才会生成所有表,如果数据库已经存在(哪怕是空库),它都会直接返回不执行任何操作。所以要在已有数据库里创建Identity表,必须用EF迁移:
- 先为AccountDbContext添加迁移脚本:
Add-Migration InitialIdentitySchema -Context AccountDbContext
- 再执行迁移更新数据库:
Update-Database -Context AccountDbContext
这会直接在你的TESTDB数据库中生成所有Identity所需的表,完全不受数据库已存在的影响。
额外提醒:两个DbContext操作同一数据库时,容易出现迁移冲突、实体映射混乱的问题,除非有特殊业务需求,否则更建议用第一种方案整合到一个DbContext中。
内容的提问来源于stack exchange,提问作者vinit
相关产品推荐
相关产品推荐

