EF6升级至EF Core:现有含ASP.NET Identity的数据库初始迁移创建及模型更新迁移实现方案咨询
我太懂这种带着现有数据库升级框架卡壳的憋屈了!尤其是还涉及ASP.NET Identity这种自带一套模型的场景,新手踩坑太正常了,完全不是笨问题~ 下面给你一套稳扎稳打的步骤,都是官方推荐的常规操作,不是什么复杂的野路子:
第一步:反向生成匹配现有数据库的EF Core模型与上下文
首先我们要让EF Core“认识”你现有的数据库结构,包括原来的Identity表。用EF Core的反向工程命令,直接从数据库生成对应的实体类和DbContext:
Package Manager Console(Visual Studio里的PMC)命令:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Data -Context AppDbContext -Force
.NET CLI命令(跨平台可用):
dotnet ef dbcontext scaffold "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -o Models -c AppDbContext -f
这个命令会把现有数据库的所有表(包括AspNetUsers、AspNetRoles这些Identity表)都生成EF Core兼容的实体类,同时生成一个对应的DbContext(这里叫AppDbContext)。生成后你可以检查下,确保模型和数据库结构完全对应。
第二步:创建“初始对齐”的空迁移
因为你的数据库已经有完整结构了,我们需要给EF Core的迁移系统做一个“初始状态标记”,让它认为当前数据库就是迁移的起点:
PMC命令:
Add-Migration InitialCreate -IgnoreChanges
CLI命令:
dotnet ef migrations add InitialCreate --ignore-changes
这个--ignore-changes参数会生成一个空的Up()和Down()方法的迁移文件,相当于告诉EF Core“现在的数据库就是这个初始状态”。然后执行命令把这个迁移标记为已应用:
PMC命令:
Update-Database
CLI命令:
dotnet ef database update
执行后,EF Core会自动在你的数据库里创建__EFMigrationsHistory表,并且把这个InitialCreate迁移的记录存进去,这样迁移系统就和现有数据库的状态对齐了。
第三步:调整模型至EF Core版ASP.NET Identity规范
接下来你可以把反向生成的Identity相关实体,替换/调整为EF Core官方的Identity模型(或者自定义继承):
- 比如把原来的
AspNetUsers实体类,改成继承IdentityUser(EF Core的Microsoft.AspNetCore.Identity里的类) - 把
AspNetRoles改成继承IdentityRole - 对照EF Core Identity的默认结构,补充/修改字段:比如添加
ConcurrencyStamp字段(用来做并发控制),调整SecurityStamp的类型,或者准备好AspNetUserTokens表对应的实体(EF Core Identity默认需要这个表来存储多因素认证、第三方登录的令牌等)
这一步你可以慢慢调整,确保你的模型和EF Core Identity的要求匹配,同时和你自己的业务需求一致。
第四步:生成并应用模型更新迁移
当你把所有模型调整好之后,就可以生成用来升级数据库到EF Core Identity的迁移了:
PMC命令:
Add-Migration UpdateToCoreIdentity
CLI命令:
dotnet ef migrations add UpdateToCoreIdentity
EF Core会自动对比当前模型和InitialCreate对应的初始模型,生成包含所有必要更改的迁移文件——比如创建AspNetUserTokens表、修改字段类型/长度、添加索引等等。你可以打开生成的迁移文件检查下,确认所有更改都是你预期的(比如你说的创建用户令牌表、修改几个字段,这些都会在Up()方法里体现)。
最后执行命令应用这个迁移:
PMC命令:
Update-Database
CLI命令:
dotnet ef database update
这样你的数据库就会升级到EF Core Identity的结构,同时迁移系统也能正常追踪后续的所有更改了。
一些额外的小提示
- 如果你的数据库之前用的是EF6的
__MigrationHistory表,完全不用担心和EF Core的__EFMigrationsHistory冲突,两者是独立的 - 调整Identity模型的时候,如果你需要自定义字段,直接在继承
IdentityUser的自定义类里添加就行,比如public string NickName { get; set; },迁移会自动处理这些字段 - 如果你在反向生成的时候,不想生成某些表,可以用
-Tables参数指定要生成的表,比如-Tables AspNetUsers,AspNetRoles,AspNetUserRoles,只生成Identity相关的表,再手动添加你的业务模型
备注:内容来源于stack exchange,提问作者Max Burridge

