來個目錄吧:
第一章-入門
第二章- 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命令。
初始化遷移
保存您的更改並構建項目。然后打開命令窗口並導航到項目文件夾。這里有一個快速的方法:
在解決方案資源管理器中,右鍵單擊項目,然后從上下文菜單中選擇在文件資源管理器中打開。

按住Shift鍵並右鍵單擊文件資源管理器中的項目文件夾,然后從上下文菜單中選擇打開命令窗口。

在輸入命令之前,停止站點的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表,以跟蹤哪些遷移已應用於數據庫。
查看該表中的數據,您將看到第一次遷移的一個條目。

運行應用程序以驗證一切仍然與以前一樣工作。

命令行界面(CLI)與軟件包管理器控制台(PMC)
用於管理遷移的EF工具可從.NET Core CLI命令或Visual Studio 程序包管理器控制台(PMC)窗口中的PowerShell cmdlet獲取。
本教程介紹如何使用CLI,但如果您願意,可以使用PMC。
有關CLI命令的信息,請參閱.NET Core CLI。
有關PMC命令的信息,請參閱軟件包管理器控制台(Visual Studio)。
作者沒說,我就先寫在這了吧。
我的建議是我們不要用上面的方式玩codefirst。跟着我的節奏來。
我們再來說說,我們常用的使用程序包管理控制台怎么玩Codefirst吧.
首先我們安裝下

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
PM> Install-Package Microsoft.EntityFrameworkCore.Tools
看到上圖了沒,依次安裝。
然后再回到文件DbInitializer把代碼:
context.Database.EnsureCreated();
注釋掉。

然后就跟用ef6一樣了。在程序包管理控制台輸入:
PM> Add-Migration InitFirstMigration

會生成兩個遷移文件。
然后我們執行命令
PM> Update-database
整個工程就ok了。
