EF Core 迁移本身不支持“打标签”(如 Git tag 那样的语义化标记),但你可以通过命名规范、注释、迁移元数据或外部记录来实现类似效果。而
MigrationBuilder.Sql()是在迁移中执行原始 SQL 的核心方法,常用于无法用 Fluent API 表达的场景(如创建函数、视图、全文索引等)。
用迁移名称模拟“标签”
EF Core 迁移文件名默认包含时间戳 + 自定义名称(如
20241015120000_AddUserTable.cs)。你可以主动在名称中嵌入语义化标识: ✅ 推荐写法:
20241015120000_v1_0_0_AddUserTable.cs(含版本号) ✅ 推荐写法:
20241015120000_ReleaseCandidate_AddAuditLog.cs(含发布阶段) ⚠️ 注意:名称只是约定,EF Core 不解析它;但团队协作时能快速识别意图。
在迁移类里加注释和元数据
在生成的迁移类(如
MyMigration.cs)顶部添加 XML 注释或自定义属性,辅助人工识别: 在
Up(MigrationBuilder migrationBuilder, ...)方法上方加
/// <summary>【v2.1】上线必备:用户行为日志表</summary>可额外定义静态字段(非 EF 所需,仅作标记):
public static readonly string Tag = "prod-2024-Q4";
用 MigrationBuilder.Sql()
安全执行原始 SQL
该方法用于在迁移中运行任意 SQL,但需注意事务、幂等性与数据库兼容性:
✅ 基本用法:migrationBuilder.Sql("CREATE VIEW v_active_users AS SELECT * FROM Users WHERE IsActive = 1;");
✅ 建议加 suppressTransaction: true(如建索引、视图):
migrationBuilder.Sql(sql, suppressTransaction: true);(避免某些 DDL 在事务中报错) ✅ 多语句建议分拆调用,或用
GO分隔(SQL Server)并配合
isIdempotent: true或手动判断是否存在 ⚠️ 避免硬编码表名/列名;若需动态拼接,务必校验输入(迁移是代码,不是用户输入流)
补充建议:用 HasComment()
标记模型(间接“打标签”)
虽然不作用于迁移本身,但在
OnModelCreating中给实体或属性加注释,会生成带
COMMENT的迁移(PostgreSQL / SQL Server 支持):
modelBuilder.Entity<user>().HasComment("【v1.2】GDPR 合规改造后用户主表");</user>
后续生成的迁移会自动包含 COMMENT ON TABLE语句,可作为数据库层的轻量标签。
基本上就这些。EF Core 没有原生标签系统,靠命名+注释+上下文约定就能满足大多数场景;
Sql()强大但要谨慎,优先用 Fluent API,只在必要时兜底。
