Logo
Section 1 / 8

迁移简介

学习如何创建迁移文件并使用它们更新数据库。

导入

迁移简介

学习如何创建迁移文件并使用它们更新数据库。

概述

在实际项目中,随着功能的不断实现,数据模型会持续更新。新的实体或属性会被添加或移除。迁移(Migrations)提供了一种机制,用于更新数据库架构,并使其与模型保持同步。这种开发方式被称为“代码优先”(Code First),因为 EF Core 的模型是唯一可信的来源。

...
迁移文件由数据模型生成,并用于更新数据库架构

注意: 本课程中的命令会生成代码和文件。通过终端,我们可以使用 Linux 命令如 ls 查看文件和目录列表,cd 切换目录,cat 查看文件内容来导航这些文件。同时,还提供了一个 SPA 小部件,展示包含生成文件的更新项目。此外,请注意 EF Core 在生成的文件名中使用时间戳,我们用 xxx 表示这些文件名。

创建并应用迁移

迁移是数据模型在某一时刻的快照。EF Core 根据两次快照之间的差异自动生成迁移源文件。

注意: 建议每次迁移的变更尽量小。这有助于在开发过程中追踪变化,减少错误,并使回滚操作更简单。

为了演示迁移功能,我们将使用以下 C# 项目:

No configuration found for ID: 23bf97858960452a05527495bcd6bb40d901ecf3c378c97e5c1bfc358c2158d8

要添加一个迁移,请点击上方代码小部件的“运行”按钮。然后,在终端中执行以下命令,创建名为 InitialMigration 的迁移:

1dotnet ef migrations add InitialMigration

注意: 建议为迁移命名时使用有意义的名称。这样在后续查看迁移历史时更容易理解其目的。

通过以下命令将该迁移应用到数据库:

1dotnet ef database update

接下来,运行一些 SQLite 命令来查看数据库内容。以下命令打开 SQLite 提示符并连接到数据库:

1sqlite3 output/Artists.db

现在,使用以下命令显示数据库中创建的所有表:

1.tables

输出片段如下:

1sqlite> .tables 2AlbumTags Employees Tags 3Albums Studios __EFMigrationsHistory 4sqlite>

请注意列表中的 __EFMigrationsHistory 表。EF Core 使用该表来记录已应用的迁移。

接着,通过执行以下命令退出 SQLite 提示符:

1.quit

更新后的项目如下:

No configuration found for ID: 82fad451a48dc362ab4cd9a5615bfb7fc122ef43945ed147f7b74c441da6c007

请注意,该项目在 Data 目录下有一个名为 ArtistsContext 的上下文类,实体类型位于 Entities 目录中。这些实体包括:

  • Employee: 表示音乐艺术家的姓名和年龄
  • Studio: 表示音乐艺术家工作的工作室地址
  • Album: 表示音乐艺术家发布的专辑
  • Tag: 表示专辑的分类标签

审查迁移文件

在更新后的项目中(标题为“包含 InitialMigration 文件的项目”),可以看到 Migrations 目录中存放了迁移源文件。我们逐一审查这些文件:

  • xxx_InitialMigration.cs:这是主要的迁移文件,包含两个方法:Up 和 Down。Up 方法包含应用于数据库的所有操作;Down 方法包含用于回滚这些更改的操作。
  • xxx_InitialMigration.Designer.cs:这是 EF Core 使用的元数据文件。
  • ArtistsContextModelSnapshot.cs:该文件在首次迁移时创建,并在每次迁移时更新。它保存当前模型的快照,用于判断新增迁移前存在哪些变更。

xxx_InitialMigration.cs 文件通过调用方法构建对象:

  • 第 11 至 101 行:使用 MigrationBuilder 类的 CreateTable 方法构建 CreateTableOperation 对象。当迁移被执行时,这些对象会创建相应的表。
  • 第 103 至 117 行:使用 MigrationBuilder 类的 CreateIndex 方法构建 CreateIndexOperation 对象。当迁移被执行时,这些对象会创建相应的索引。

值得注意的是表的创建顺序。EF Core 会先创建父表,再创建子表。例如,Studios 表在 Employees 表之后创建,因为它是 Employees 的子表。

审查数据库更新过程

执行 dotnet ef database update 命令后,EF Core 执行以下操作:

  • 如果数据库不存在,则根据 ArtistsContext 类中 OnConfiguring 方法指定的连接字符串创建数据库。
  • 应用 xxx_InitialMigration.cs 文件中定义的所有操作,包括将 ArtistsContext.cs 中定义的实体转换为数据库表。
  • 在数据库中创建名为 __EFMigrationsHistory 的表(如果尚不存在)。EF Core 使用该表来记录已应用的迁移。

结论

在生产数据库中使用迁移