sayinbrahim/ef-migration-safety
GitHub: sayinbrahim/ef-migration-safety
EF Core 迁移文件的静态安全分析器,在 CI 阶段拦截可能导致生产数据丢失或迁移失败的危险操作。
Stars: 0 | Forks: 0
# ef-migration-safety
**用于 EF Core 迁移的静态安全分析器。在破坏性操作影响您的数据库之前将其捕获。**
## 为什么开发此工具
EF Core 迁移功能强大——却又悄无声息。在同一个列上先执行 `DropColumn` 再执行 `AddColumn`,在差异对比(diff)中看起来合情合理,编译时没有任何警告,并且能顺利通过 CI。然后它在生产环境中运行,并破坏了该列中的所有数据。在未提供默认值的情况下添加非空(non-nullable)列,在开发阶段(空表)会悄无声息地失败,而在首次部署到真实数据库时则会引发大崩溃。当您意识到发生了什么时,回滚窗口早已关闭。
`ef-migration-safety` 作为 CI 步骤运行,会在迁移操作接触数据库之前,以静态方式标记出这些模式。它会读取 `.cs` 迁移文件,使用 Roslyn 对其进行解析,并报告所有历史上曾引发过生产事故的操作。
## 安装
```
dotnet tool install -g EfMigrationSafety.Cli
```
## 用法
```
# 分析目录中的所有 migration
ef-migration-safety check ./src/MyApp/Migrations
# 在任何警告时使 build 失败(在 CI 中很有用)
ef-migration-safety check ./src/MyApp/Migrations --strict
# 输出为 JSON 以供下游 tooling 使用
ef-migration-safety check ./src/MyApp/Migrations --output json
```
### 输出示例
```
20240315120000_ChangeEmailColumnType.cs
⚠ Line 18: DropColumn + AddColumn pattern detected for column 'Email' (potential data loss). Use RenameColumn instead to preserve data.
Recommendation: If this is a rename, replace with migrationBuilder.RenameColumn(). If this is intentional column replacement, document the data backfill strategy.
20240320100000_RenameEmailColumn.cs
ℹ Line 12: Column rename detected: 'Email' → 'EmailAddress' on table 'Users'. Ensure all application code, queries, and ORM mappings referencing 'Email' are updated in the same deployment.
Recommendation: Search the codebase for the old name before deploying. Common locations: entity classes, LINQ queries, raw SQL, stored procedures, reports, integration mappings.
Summary: 10 file(s) clean, 1 with info, 1 with warnings.
```
## 检查项
| 分析器 | 状态 | 捕获内容 |
|---|---|---|
| `DropAddColumn` | **已实现** | 在 `Up()` 中对同一列名执行 `DropColumn` + `AddColumn` —— 会破坏所有列数据 |
| `NonNullableWithoutDefault` | **已实现** | 在未提供默认值的情况下向现有表添加非空(non-nullable)列 —— 在非空表中会执行失败 |
| `EmptyDownMethod` | **已实现** | 空的或抛出 `NotImplementedException` 的 `Down()` 方法 —— 导致无法回滚 |
| `RenameOperation` | **已实现** (Info) | 未配合更新应用代码的 `RenameColumn` / `RenameTable` —— 会破坏正在运行的实例 |
## 路线图
请参阅 [ROADMAP.md](ROADMAP.md) 获取计划检查项的完整列表。近期计划添加的功能:
- 检测会截断数据的 `ALTER COLUMN` 类型更改(例如,`nvarchar(256)` → `nvarchar(50)`)
- 检测在未设置 `ONLINE = ON` 的情况下对大型表创建索引
- 检测多步骤迁移中缺失的事务包装
- `--baseline` 标志,用于通过内联注释抑制已知安全的问题
## 贡献
欢迎贡献。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 获取设置说明和分析器接口信息。
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。
标签:EF Core, SOC Prime, 云安全监控, 多人体追踪, 开发工具, 数据库迁移, 静态分析