基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5 EF Core 的codefirst使用 迁移简介 初始化迁移 检查Up和Down方法 检查数据模型快照 将迁移应用于数据库 命令行界面(CLI)与软件包管理器控制台(PMC) 我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

来个目录吧:
第一章-入门
第二章- Entity Framework Core Nuget包管理
第三章-创建、修改、删除、查询
第四章-排序、过滤、分页、分组
第五章-迁移,EF Core 的codefirst使用
暂时就这么多。后面陆续更新吧

在本教程中,您将开始使用EF Core迁移功能来管理数据模型更改。在后面的教程中,您将在更改数据模型时添加更多迁移。

迁移简介

开发新应用程序时,数据模型会频繁更改,并且每次模型更改时,它都会与数据库不同步。
您通过配置Entity Framework以创建数据库(如果它不存在)来启动这些教程。
然后每次更改数据模型时,添加,删除或更改实体类或更改DbContext类 - 您可以删除数据库,EF将创建一个与模型匹配的新类,并为其添加测试数据。

这种使数据库与数据模型保持同步的方法运行良好,直到将应用程序部署到生产环境。
当应用程序在生产环境中运行时,它通常存储您想要保留的数据,并且您不希望每次进行更改时丢失所有内容,例如添加新列。
EF Core Migrations功能通过使EF更新数据库模式而不是创建新的数据库来解决这个问题。

更改连接字符串

在appsettings.json文件中,将连接字符串中的数据库名称更改为ContosoUniversity2 ,当然你可以自己取 个你喜欢的名字。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=ContosoUniversity2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

注意:
作为更改数据库名称的替代方法,您可以删除数据库。使用SQL Server对象资源管理器(SSOX)或使用database drop CLI命令:

dotnet ef database drop -c SchoolContext

以下部分说明如何使用CLI命令。

初始化迁移

保存您的更改并构建项目。然后打开命令窗口并导航到项目文件夹。这里有一个快速的方法:

解决方案资源管理器中,右键单击项目,然后从上下文菜单中选择在文件资源管理器中打开。

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

按住Shift键并右键单击文件资源管理器中的项目文件夹,然后从上下文菜单中选择打开命令窗口

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

在输入命令之前,停止站点的IIS Express,或者您可能会收到一条错误消息:“ 无法访问文件... ContosoUniversity.dll,因为它正被另一个进程使用 ”。要停止站点,请找到IIS Express图标,然后右键单击它,然后单击ContosoUniversity停止站点。

停止IIS Express后,在命令窗口中输入以下命令:

dotnet ef migrations add InitialCreate -c SchoolContext

在命令窗口中看到如下输出:

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:15.63
Done. To undo this action, use 'ef migrations remove'

您必须包含-c SchoolContext参数以指定数据库上下文类,因为项目有两个上下文类(另一个是ASP.NET Identity)。

检查Up和Down方法

当您执行migrations add命令时,EF生成将从头创建数据库的代码。此代码位于Migrations文件夹中的名为的文件中_InitialCreate.cs。类的Up方法InitialCreate创建与数据模型实体集对应的数据库表,Down方法将删除它们,如下面的示例所示。

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Student",
            columns: table => new
            {
                ID = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                EnrollmentDate = table.Column<DateTime>(nullable: false),
                FirstMidName = table.Column<string>(nullable: true),
                LastName = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Student", x => x.ID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Course");
        // Additional code not shown
    }
}

迁移调用该Up方法来实现迁移的数据模型更改。当您输入回滚更新的命令时,Migrations会调用该Down方法。

此代码用于在输入migrations add InitialCreate命令时创建的初始迁移。迁移名称参数(在示例中为“InitialCreate”)用于文件名,可以是任何您想要的。最好选择一个字词或短语,总结迁移过程中所做的工作。例如,您可以将以后的迁移命名为“AddDepartmentTable”。

如果在数据库已存在时创建了初始迁移,则会生成数据库创建代码,但不必运行,因为数据库已与数据模型匹配。当您将应用程序部署到数据库尚不存在的另一个环境时,此代码将运行以创建数据库,因此首先测试它是一个好主意。这就是为什么你先更改了连接字符串中数据库的名称 - 这样迁移可以从头开始创建一个新的。

检查数据模型快照

迁移还会在Migrations / SchoolContextModelSnapshot.cs中创建当前数据库模式的“快照” 。下面是该代码的样子:

[DbContext(typeof(SchoolContext))]
partial class SchoolContextModelSnapshot : ModelSnapshot
{
    protected override void BuildModel(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasAnnotation("ProductVersion", "1.0.0-rtm-21431")
            .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

        modelBuilder.Entity("ContosoUniversity.Models.Course", b =>
            {
                b.Property<int>("CourseID");

                b.Property<int>("Credits");

                b.Property<string>("Title")
                    .HasAnnotation("MaxLength", 50);

                b.HasKey("CourseID");

                b.ToTable("Course");
            });

        // Additional code for Enrollment and Student tables not shown

        modelBuilder.Entity("ContosoUniversity.Models.Enrollment", b =>
            {
                b.HasOne("ContosoUniversity.Models.Course", "Course")
                    .WithMany("Enrollments")
                    .HasForeignKey("CourseID")
                    .OnDelete(DeleteBehavior.Cascade);

                b.HasOne("ContosoUniversity.Models.Student", "Student")
                    .WithMany("Enrollments")
                    .HasForeignKey("StudentID")
                    .OnDelete(DeleteBehavior.Cascade);
            });
    }
}

由于此代码必须在最新迁移后反映数据库状态,因此您无法通过删除名为的文件来删除迁移 __.cs
如果删除该文件,则剩余的迁移将与数据库快照文件不同步。
要删除您添加的最后一个迁移,请使用dotnet ef migrations remove命令。

将迁移应用于数据库

在命令窗口中,输入以下命令以在其中创建数据库和表。

dotnet ef database update -c SchoolContext

命令的输出与命令migrations add类似。

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:17.34
Done.

使用SQL Server对象资源管理器来检查数据库,就像您在第一个教程中一样。
您将注意到添加了一个__EFMigrationsHistory表,以跟踪哪些迁移已应用于数据库。
查看该表中的数据,您将看到第一次迁移的一个条目。

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

运行应用程序以验证一切仍然与以前一样工作。

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

命令行界面(CLI)与软件包管理器控制台(PMC)

用于管理迁移的EF工具可从.NET Core CLI命令或Visual Studio 程序包管理器控制台(PMC)窗口中的PowerShell cmdlet获取。
本教程介绍如何使用CLI,但如果您愿意,可以使用PMC。
有关CLI命令的信息,请参阅.NET Core CLI

有关PMC命令的信息,请参阅软件包管理器控制台(Visual Studio)

作者没说,我就先写在这了吧。
我的建议是我们不要用上面的方式玩codefirst。跟着我的节奏来。

我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

首先我们安装下

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

看到上图了没,依次安装。
然后再回到文件DbInitializer把代码:

  context.Database.EnsureCreated();

注释掉。
基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

然后就跟用ef6一样了。在程序包管理控制台输入:

PM> Add-Migration InitFirstMigration

基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
EF Core 的codefirst使用
迁移简介
初始化迁移
检查Up和Down方法
检查数据模型快照
将迁移应用于数据库
命令行界面(CLI)与软件包管理器控制台(PMC)
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.

会生成两个迁移文件。
然后我们执行命令

PM> Update-database

整个工程就ok了。