C# 实体框架数据库迁移方法 C# EF Core如何进行数据库迁移

来源:这里教程网 时间:2026-02-21 17:40:05 作者:

EF Core 迁移命令在 Package Manager Console 中怎么写

迁移必须在包含

DbContext
的项目目录下执行,且项目需安装
Microsoft.EntityFrameworkCore.Tools
。常见错误是直接在解决方案根目录运行,导致提示“找不到 DbContext 类型”或“无法解析 DbContext”。

Add-Migration InitialCreate
:生成首次迁移文件(含
Up
/
Down
方法),文件名可自定义,但建议语义化
Update-Database
:将待应用的迁移同步到数据库;若指定名称(如
Update-Database InitialCreate
),则只执行到该迁移
Remove-Migration
:撤回最后一次
Add-Migration
生成的文件(不触碰数据库),适合改错后重来

注意:

Update-Database
默认连接字符串来自
Startup.cs
Program.cs
中的
UseSqlServer
配置,不是 appsettings.json 的默认节——除非你显式传入
-ConnectionString
参数。

使用 dotnet CLI 执行迁移时为什么报错“Unable to create an object of type 'AppDbContext'”

这是最常遇到的启动失败错误,本质是 EF Core 运行时无法构造你的

DbContext
。根本原因通常是依赖注入链断裂,比如:

AppDbContext
构造函数依赖了未注册的服务(如
IConfiguration
或自定义仓储接口)
项目中存在多个
DbContext
,但没用
[DbContextOptions<t>]</t>
明确指定目标类型
缺少无参构造函数,且
OnConfiguring
未被重写(CLI 不走
Startup
的 DI 容器)

解决方法:在

AppDbContext
中补充一个仅用于迁移的构造函数,例如:

public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public AppDbContext() : base(new DbContextOptionsBuilder<AppDbContext>()
    .UseSqlServer("Server=.;Database=TestDb;Trusted_Connection=true;")
    .Options) { }

或者更稳妥的方式:确保

dotnet ef migrations add
命令能识别你的启动项目和上下文类型,加
--project
--startup-project
参数。

迁移文件里生成的 SQL 为什么和预期不符?比如字段没加索引或约束丢失

EF Core 的迁移基于模型快照(

ModelSnapshot
)与当前
DbContext
模型对比生成,不是实时读取数据库结构。所以以下情况会导致 SQL 异常:

手动修改过迁移文件中的
Up
方法,后续再
Add-Migration
会基于修改后的版本继续推导,产生偏差
实体类上用了
[Column(TypeName = "datetime2")]
等特性,但忘了在
OnModelCreating
中配置对应索引或约束
使用了
HasIndex(e => e.Status).IsUnique()
却没调用
HasDatabaseName("IX_Orders_Status")
,导致迁移名随机,难以追踪

建议始终用 Fluent API 在

OnModelCreating
中集中声明约束,避免混用 Data Annotations 和 Fluent 风格;迁移生成后,打开
Up(MigrationBuilder migrationBuilder)
方法检查 SQL 是否含
CREATE INDEX
ADD CONSTRAINT
,别盲目
Update-Database

生产环境部署迁移时如何避免直接执行
Update-Database

线上库不允许开发机直连,也不能依赖 PowerShell 环境。正确做法是把迁移编译成 SQL 脚本,交由 DBA 审核执行:

Script-Migration
(PMC)或
dotnet ef migrations script
(CLI)生成完整脚本,默认从初始迁移到最新
-From
-To
参数可限定范围,例如只导出 v1.2 到 v1.3 的变更
脚本不含
IF NOT EXISTS
判断,执行前需确认目标库状态;若要幂等,得自己加包装逻辑或用
--idempotent
参数(仅限 SQL Server)

特别注意:脚本不会执行

Seed
数据(即
HasData
),这部分仍需代码控制,或拆成独立部署步骤。

相关推荐