C# (.NET) 中的数据库迁移:Entity Framework、FluentMigrator 及其他方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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();


FluentMigrator 的优点

推荐