ASP.NET Core 中同步领域模型与数据库架构

admin
admin
2021-06-03
分享:

本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP)
本文出自《从零开始学 ASP.NET Core 与 EntityFramework Core》目录
视频课程效果更佳:跨平台开发实战掌握 ASP.NET Core 与 EntityFramework Core

ASP.NET Core 中同步领域模型与数据库架构

在本章节中我们将学习:

  • 如何使用 ASP.NET Core 中的迁移保持领域模型与数据库架构同步
  • 如何在 ASP.NET Core 中添加迁移
  • 如何在 ASP.NET Core 中删除迁移
  • 如何应用迁移及更新数据库
  • 如何撤消已应用的迁移并将数据库架构回滚到指定状态
  • ModelSnapshot 类和__EFMigrationsHistory 表的用途是什么

在我们开发程序并添加新功能的时候,我们程序的领域类会发生变化。当领域类更改时,也必须对基础数据库架构进行相应的更改。否则,数据库架构不同步,程序无法按照预期进行正常工作。 但是,最重要的一点是不要手动对数据库架构进行这些更改,我们应该使用迁功能来保持数据库架构在程序领域类更改时让它们保持同步性。

实践一下

目前,我们的领域模型 Student 类没有还不能保存学生的头像信息,所以我们添加一个字段 PhotoPath 的属性给 Student 类。

 public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public MajorEnum? Major { get; set; }
        public string Email { get; set; }


而为了能够存储学生的 PhotoPath ,我们希望将 PhotoPath 属性添加到 Student 类。

 public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public MajorEnum? Major { get; set; }
        public string Email { get; set; }
        public string PhotoPath { get; set; }
    }

要使数据库中的 Students 表与 Student 模型类保持同步,我们需要添加新的迁移记录并执行它以更新数据库。

添加新迁移

使用 Add-Migration命令添加新迁移。AddPhotoPathToStudents 是迁移的名称。

Add-Migration AddPhotoPathToStudents

Migrations 文件夹中的文件说明

执行上述命令会生成以下文件:

第一个文件是:[TimeStap]_AddPhotoPathToStudents.cs , 文件名由 时间戳下划线和定义的迁移名称组成。

此文件中的类名与迁移名称相同。该类包含 2 个方法分别是 **Up()**和 Down()

  • Up()方法包含对模型类所做的更改,并会将它们应用到数据库架构中的代码。
  • Down()方法包含撤消更改的代码。

第二个文件是:[DbContextMajor]ModelSnapshot.cs ,文件名是由当前自定义的 DbContext 名称和 ModelSnapshot 组成,顾名思义此文件包含当前模型的快照,。。

当添加第一个迁移并在后续每次迁移发生更新时,都将创建此文件。EF Core 迁移 API 会使用此文件来确定添加下一次迁移时已更改的内容。

应用迁移和更新数据库

要应用迁移并更新数据库,请使用 Update-Database 命令。此命令执行 Up()方法中的代码,并将更改应用到数据库中。

Update-Database

__EFMigrationsHistory表的使用

执行第一次迁移时,会在数据库中创建__EMMigrationsHistory表。 此表用于跟踪应用于数据库的迁移。每次应用的迁移都会有添加一条记录信息。

删除迁移

要删除迁移,需要执行 Remove-Migration命令

它一次只删除一个迁移,并且仅删除尚未应用到数据库的最新迁移。如果有已应用迁移记录,强制执行 Remove-Migration 命令将引发以下异常。

The migration 'Latest_Migration_Name' has already been applied to the database. Revert it and try again.

删除已应用于数据库的迁移

让我们通过示例了解如何删除已应用于数据库的迁移。 假设我们已经将以下 3 个迁移应用于数据库。

  • Migration_One
  • Migration_Two
  • Migration_Three

我们要删除迁移 Migration_TwoMigration_Three。由于所有这 3 次迁移都已应用于数据库,因此执行Remove-Migration 命令将引发错误。

为了能够删除已应用于数据库的迁移,我们首先必须撤消迁移对数据库所做的更改。我们需要做的方法是执行带有迁移名称的 Update-Database 命令。

我们需要做的事情是首先要回滚Migration_TwoMigration_Three所做的更改,并且需要执行迁移记录 Migration_One 将数据库架构状态与当前需要回滚的领域模型状态一致。

为此,我们使用 Migration_One 名称执行 Update-Database 命令,如下所示。

Update-Database Migration_One

执行上述命令将撤消Migration_TwoMigration_Three 所做的更改。EF Core 还将从数据库__EFMigrationsHistory 表中删除这两次迁移的记录。

但是,迁移代码文件仍存在于"Migrations"文件夹中。要删除代码文件,请使用 Remove-Migration 命令。由于我们要删除 Migration_Three 和 Migration_Two 代码文件,因此我们要执行两次 Remove-Migration 命令。

Remove-Migration  Migration_Three
Remove-Migration  Migration_Two

文章说明

如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com 保留版权
感谢您对我的支持

关注微信公众号:角落的白板报

公众号:角落的白板报