C# (.NET) 中的数据库迁移:完整指南
管理数据库架构变更是开发任何 C# (.NET) 应用程序时的一项关键任务。迁移允许您对数据库结构变更(添加表、列、索引)进行版本控制、跟踪并自动应用,使其与应用程序代码同步。在 .NET 生态系统中,有几种成熟的工具可用于此任务。在本文中,我们将详细分析三种主要方法:内置的 Entity Framework Core 机制,以及专门的库 FluentMigrator 和 DbUp。
1. Entity Framework Core Migrations (EF Core)
对于已使用 ORM Entity Framework Core 的项目来说,这是最流行的方法。迁移与您的数据模型紧密集成(Code-First 方法)。
安装与配置
要使用迁移,您需要安装以下包:
dotnet add package Microsoft.EntityFrameworkCore.Tools创建和应用迁移
在修改您的 C# 模型后(例如,在 User 类中添加新的 Email 属性),在终端中执行:
dotnet ef migrations add AddEmailToUserdotnet ef database update第一条命令将创建一个包含自动生成的 C# 代码的迁移文件。第二条命令将其应用到您的数据库。
迁移代码示例(生成的文件):
public partial class AddEmailToUser : Migration{ protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Email", table: "Users", type: "nvarchar(200)", nullable: true); }
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Email", table: "Users"); }}Up 方法应用更改,Down 方法回滚更改。
EF Core Migrations 的优缺点
- 优点: 与模型紧密集成、自动生成代码、支持回滚、内置于 .NET 生态系统。
- 缺点: 与 EF Core 绑定、处理非平凡更改(例如重命名列)时复杂、团队中可能出现冲突问题。
2. FluentMigrator
这是一个独立、轻量级的迁移库,不绑定到特定的 ORM。迁移使用 C# 通过 fluent 接口手动编写。
安装
dotnet add package FluentMigrator迁移示例
[Migration(202310010001)]public class CreateUserTable : Migration{ public override void Up() { Create.Table("Users") .WithColumn("Id").AsInt32().PrimaryKey().Identity() .WithColumn("Name").AsString(100).NotNullable() .WithColumn("Email").AsString(200).Nullable(); Create.Index("IX_Users_Email") .OnTable("Users") .OnColumn("Email"); }
public override void Down() { Delete.Table("Users"); }}运行迁移
使用 runner 来执行迁移。在 Program.cs 中的配置示例:
var serviceProvider = new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb => rb .AddSqlServer() .WithGlobalConnectionString("YourConnectionString") .ScanIn(typeof(CreateUserTable).Assembly).For.Migrations()) .BuildServiceProvider();
using var scope = serviceProvider.CreateScope();var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();runner.MigrateUp();