共计 1562 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
在 C# 开发中,数据库表结构的变更是一个常见需求。传统的手动创建表方式存在诸多问题:

- 开发与生产环境表结构不一致导致运行时错误
- 缺少版本控制,难以追踪历史变更
- 团队协作时难以同步数据库变更
- 回滚困难,出错成本高
技术选型对比
Entity Framework Core 相比其他 ORM 工具 (Dapper、NHibernate 等) 的迁移优势:
- 声明式迁移:通过 C# 类定义数据结构,自动生成 SQL
- 版本控制:每次迁移生成独立版本文件
- 跨平台:支持多种数据库引擎(MySQL/SQL Server/PostgreSQL 等)
- CLI 工具链:提供完整的命令行操作支持
核心实现细节
1. 定义 Model 类
// Product.cs
public class Product
{[Key] // 主键注解
public int Id {get; set;}
[Required] // 非空约束
[MaxLength(100)] // 长度限制
public string Name {get; set;}
[Column(TypeName = "decimal(18,2)")] // 列类型定义
public decimal Price {get; set;}
public DateTime CreatedDate {get; set;} = DateTime.Now;
}
2. 配置 DbContext
// AppDbContext.cs
public class AppDbContext : DbContext
{public DbSet<Product> Products { get; set;}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=MyAppDb;Trusted_Connection=True;");
}
3. 创建迁移
-
安装必要工具包:
dotnet tool install --global dotnet-ef dotnet add package Microsoft.EntityFrameworkCore.Design -
生成迁移文件:
dotnet ef migrations add InitialCreate --output-dir Data/Migrations
4. 应用迁移
dotnet ef database update
性能与安全性考量
- 锁表问题:
- 大型表迁移使用
Online模式(数据库支持时) -
避免在生产高峰期执行迁移
-
敏感数据处理:
- 不要在迁移中硬编码敏感信息
- 使用
SecureString处理密码字段 - 考虑加密敏感列数据
生产环境避坑指南
迁移冲突解决
- 使用
dotnet ef migrations script生成 SQL 脚本 - 手动解决冲突后重新生成迁移
- 关键操作前备份数据库
回滚操作
-
回退到特定迁移版本:
dotnet ef database update LastGoodMigration -
完全移除最后一次迁移:
dotnet ef migrations remove
团队协作建议
- 迁移文件管理:
- 将迁移文件纳入版本控制
-
禁止直接修改已提交的迁移文件
-
自动化流程:
- CI/CD 流水线中加入迁移验证步骤
- 预生产环境测试迁移脚本
完整示例代码
// Program.cs 示例
using var db = new AppDbContext();
db.Products.Add(new Product
{
Name = "示例产品",
Price = 99.99m
});
db.SaveChanges();
总结
通过 EF Core 迁移功能,我们实现了从 Model 到数据库表的自动化管理。这种方法不仅提高了开发效率,更确保了数据库变更的可控性和可追溯性。建议在团队中建立统一的迁移规范,并考虑将迁移过程整合到 CI/CD 流程中,以实现更稳健的数据库变更管理。
正文完
