基於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了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM