• 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5


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

    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命令。

    初始化迁移

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

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

    Paste_Image.png

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

    Paste_Image.png

    在输入命令之前,停止站点的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表,以跟踪哪些迁移已应用于数据库。
    查看该表中的数据,您将看到第一次迁移的一个条目。

    Paste_Image.png

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

    Paste_Image.png

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

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

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

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

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

    首先我们安装下

    Paste_Image.png

    PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
    
    PM> Install-Package Microsoft.EntityFrameworkCore.Tools
    

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

      context.Database.EnsureCreated();
    

    注释掉。
    Paste_Image.png

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

    PM> Add-Migration InitFirstMigration
    

    Paste_Image.png

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

    PM> Update-database
    

    整个工程就ok了。

  • 相关阅读:
    [noip2010]关押罪犯 并查集
    双栈排序 noip2008
    欧拉函数
    中国剩余定理(孙子定理)
    求组合数
    线性素数筛
    洛谷 P2661 信息传递
    图的最短路
    Mzc和男家丁的游戏
    最佳旅游线路
  • 原文地址:https://www.cnblogs.com/wer-ltm/p/6528553.html
Copyright © 2020-2023  润新知