迁移简介
学习如何创建迁移文件并使用它们更新数据库。
概述
在实际项目中,随着功能的不断实现,数据模型会持续更新。新的实体或属性会被添加或移除。迁移(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 使用该表来记录已应用的迁移。