共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 C# 项目中,数据库表结构的变更是一个常见需求。传统手动创建或修改 SQL 脚本的方式存在以下问题:

- 难以维护:随着项目迭代,SQL 脚本数量激增,版本管理困难
- 容易出错:手动编写 SQL 容易遗漏字段或约束
- 缺乏一致性:开发、测试、生产环境的表结构难以保持同步
技术选型对比
常见的.NET ORM 工具迁移功能对比:
- Entity Framework Core:微软官方支持,迁移工具集成度高
- Dapper:轻量级但需要手动管理迁移
- NHibernate:功能强大但配置复杂
对于大多数项目,EF Core 的迁移系统提供了最佳平衡点。
核心实现细节
1. 定义 Model 类
Model 类是数据库表的 C# 表示。以下是一个典型的用户模型示例:
public class User
{[Key]
public int Id {get; set;}
[Required]
[MaxLength(100)]
public string Username {get; set;}
[EmailAddress]
public string Email {get; set;}
public DateTime CreatedAt {get; set;} = DateTime.UtcNow;
}
2. 配置 DbContext
DbContext 是 EF Core 的核心组件,负责数据库交互:
public class AppDbContext : DbContext
{public DbSet<User> Users { get; set;}
protected override void OnConfiguring(DbContextOptionsBuilder options)
{options.UseSqlServer("YourConnectionString");
}
}
3. 创建迁移
在项目目录执行以下命令:
dotnet ef migrations add InitialCreate
这会生成迁移文件,包含 Up(应用变更)和 Down(回滚变更)方法。
4. 应用迁移到数据库
执行以下命令将迁移应用到数据库:
dotnet ef database update
完整代码示例
Model 定义
// Models/Product.cs
public class Product
{public int Id { get; set;}
public string Name {get; set;}
public decimal Price {get; set;}
public int Stock {get; set;}
}
DbContext 配置
// Data/AppDbContext.cs
public class AppDbContext : DbContext
{public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<Product> Products {get; set;}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Product>()
.Property(p => p.Price)
.HasColumnType("decimal(18,2)");
}
}
性能与安全性考量
锁表问题
- 大型表迁移可能导致长时间锁表
- 解决方案:
- 在低峰期执行迁移
- 考虑使用 Online Schema Change 工具
敏感数据处理
- 避免在迁移中硬编码敏感信息
- 使用环境变量或密钥管理系统存储连接字符串
生产环境避坑指南
处理迁移冲突
- 检查
__EFMigrationsHistory表 - 使用
dotnet ef migrations script生成 SQL 脚本 - 手动合并冲突部分
回滚迁移
dotnet ef database update LastGoodMigration
结语
在团队协作中,建议:
- 将迁移文件纳入版本控制
- 建立迁移评审流程
- 考虑在 CI/CD 流程中集成自动迁移
自动化迁移在测试环境中可行,但对生产环境应保持谨慎态度,建议保留人工确认环节。
正文完
发表至: 编程开发
近一天内
