从EF 6.1.2迁移至EF Core 2.1:数据库迁移文件如何处理?
我刚好处理过类似的EF6到EF Core的迁移场景,针对你提到的30+个现有迁移文件的问题,给你梳理两种可行方案和示例参考:
从EF 6.1.2迁移到EF Core 2.1:迁移文件处理指南
核心前提:EF6与EF Core迁移系统不兼容
先明确一个关键事实:EF6的迁移文件(包括Configuration类、各个迁移类)和EF Core的迁移系统底层逻辑完全不同,没办法直接复用现有EF6迁移文件。不过不用慌,有两种主流方案可以平滑处理这个问题:
方案1:基于当前数据库状态生成初始EF Core迁移(推荐)
这是生产环境最常用的方案,适合已经有稳定数据库的场景,相当于把现有数据库状态作为EF Core迁移的起点:
- 先确保你的EF Core DbContext已经正确映射了所有现有实体(和EF6的模型完全对齐,包括字段、关系、索引等)
- 打开Package Manager Console(或使用.NET CLI)执行以下命令,生成EF Core的初始迁移:
这里的# Package Manager Console Add-Migration InitialCreate -IgnoreChanges # .NET CLI 等价命令 dotnet ef migrations add InitialCreate --ignore-changes-IgnoreChanges(或--ignore-changes)参数非常关键:它会让EF Core忽略当前模型和数据库的结构差异,直接生成一个仅包含EF Core迁移历史表创建逻辑的空迁移(或者说,把当前数据库状态标记为EF Core迁移的初始状态)。 - 后续所有新的数据库变更,都使用EF Core的标准迁移命令(
Add-Migration、Update-Database)来管理即可。
方案2:手动迁移EF6迁移逻辑到EF Core
如果需要保留完整的历史迁移可追溯性(比如需要在全新环境重新执行从初始到当前的完整迁移流程),可以手动把EF6的迁移逻辑转换为EF Core的迁移:
- 逐个查看EF6迁移文件中的
Up和Down方法,把EF6的API调用转换为EF Core 2.1对应的API:- 注意EF Core的迁移API参数结构更偏向于fluent配置,部分数据类型的名称也有变化(比如SQL Server场景下,EF6的
String对应EF Core的nvarchar)
- 注意EF Core的迁移API参数结构更偏向于fluent配置,部分数据类型的名称也有变化(比如SQL Server场景下,EF6的
- 转换示例:
EF6的迁移片段:
转换为EF Core 2.1的迁移片段:public override void Up() { CreateTable( "dbo.Products", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(nullable: false, maxLength: 100), Price = c.Decimal(nullable: false, precision: 18, scale: 2), }) .PrimaryKey(t => t.Id); }protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "Products", columns: table => new { Id = table.Column<int>(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Name = table.Column<string>(maxLength: 100, nullable: false), Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false), }, constraints: table => { table.PrimaryKey("PK_Products", x => x.Id); }); } - 避免迁移历史表冲突:EF6的迁移历史表是
__MigrationHistory,EF Core默认是__EFMigrationsHistory,如果需要共存(比如暂时还要维护EF6版本),可以在EF Core的DbContext中自定义迁移历史表名称:protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( "YourDatabaseConnectionString", x => x.MigrationsHistoryTable("__EFCoreMigrationsHistory")); }
额外注意事项
- 查询验证:你提到重写部分查询问题不大,但要注意EF Core 2.1和EF6的LINQ查询支持有差异,比如
Include的重载行为、GroupBy的结果处理,建议先在测试环境验证核心业务查询 - 工具版本:确保安装了匹配EF Core 2.1的工具包,在Package Manager Console执行:
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 2.1.14 - 全流程测试:无论用哪种方案,都要在测试环境完整执行迁移流程,验证数据库结构、数据完整性和应用功能是否正常
内容的提问来源于stack exchange,提问作者Dabblernl
相关产品推荐
相关产品推荐

