EF Core 快速上手——創建應用的DbContext

本章導航


  • 定義應用的DbContext
  • 創建DbContext的一個實例
  • 創建應用的數據庫

本節將介紹對的EF Core創建數據庫的相關知識進行介紹。在EF Core中數據庫的創建和更改可以通過提供的命令執行。這種你操作俗稱數據庫遷移



EF Core 快速上手——創建應用的DbContext


為了創建數據庫,你需要執行操作:

  • 定義應用的DbContext,這個可以通過創建一個類並讓它繼承自EF Core 的DbContext來實現。
  • 每次要訪問數據庫時,都要創建該類的實例。

您將在本章後面看到的所有數據庫查詢都使用這些步驟,我現在開始詳細介紹。

2.2.1 定義應用的DbContext: EfCoreContext

使用 EF Core 所需的關鍵類是應用程序的 dbcontext。這個類繼承自EF Core的 DbContext,並通過添加各種屬性讓您的軟件能夠訪問數據庫表。它也包含了一些你可以重寫的方法來訪問EF Core 的其他屬性。比如,配置數據庫建模等等。

圖2.6給出了應用的DbContext概覽,並指出了所有重要的部分。

EF Core 快速上手——創建應用的DbContext


NOTE:我先跳過配置數據庫建模,這個可以通過在應用的DbContext的OnModel-Creating 方法中實現。第6和7章會涉及到數據庫建模的細節。

2.2.2 創建DbContext的一個實例

第1章向你展示了通過重寫**OnConfiguring**方法創建應用的DbContext。那種方式的缺點是數據庫連接串是固定的。本章你將使用另一種方法,因為我想在開發和單元測試階段是使用不同的數據庫。你將使用一種方法,這種方法通過應用的DbContext構造函數提供數據庫連接字符串。

NOTE:第15章將涉及到EF Core應用程序的單元測試。

清單2.2提供了創建應用程序的dbcontext(稱為efcorecontext)時數據庫的Options(DbContextOptions)。老實說,這個清單基於我的單元測試,因為他有益於向你展示組件的各個部分。第5章,將在ASP.NET Core應用中使用EF Core,通過依賴注入的反射方式構建應用的DbContext。

EF Core 快速上手——創建應用的DbContext


在清單的末尾,你在using語句內部創建了一個EfCoreContext的實例。為什麼要用using語句呢?因為DbContext有一個IDisposable接口,所以你在使用完成之後,必須釋放。從現在起,你看到的context變量,基本上使用了清單2.2的方式或者相似的方式創建的。

2.2.3 為你的應用創建數據庫

使用EF Core創建數據庫有幾種方式,但是通常使用EF Core的migrations特性。這將使用應用程序的 dbcontext 和實體類,就像我剛才描述的那樣, 作為數據庫結構的模型。Add-Migration命令首先對數據庫建模,然後使用該模型,生成命令以創建適合該模型的數據庫。

TIP:如果你正在運行從github上下載的歲隨書源碼,你不需要執行Migrate命令。因為代碼裡使用了context.Database.EnsureCreated命令。這種方式沒有使用Migrate靈活,但是不需要你敲命令即可創建數據庫。

除了創建數據庫,migrations 命令的偉大之處在於,它們可以更新數據庫根據你的實體模型變化。如果你更改了實體模型或者應用DbContext的配置,Add- Migration會構建一系列命令來更新現有的數據庫。

第一個是對象關係的不匹配。為了使用migration特性,你需要在你的啟動項目安裝Microsoft.EntityFrameworkCore.Tools包,可以在NuGet管理器中搜索。這將使你能夠在Visual Studio Package Manager Console (PMC)中時使用Migrate命令。這是你需要的:

  • Add-Migration MyMigrationName
  • 這會創建一系列命令來對數據庫進行遷移,從當前狀態到與你的應用DbContext和實體模型相匹配的狀態。命令中的MyMigrationName是你將要遷移到的名字。
  • Update-Database ——這個命令會把 Add-Migration構建的命令應用到你的數據庫。如果數據庫不存在,Update-Database 命令 將會執行創建。如果數據庫已經存在,Update-Database 命令將會檢測是否執行過數據庫遷移。如果有數據庫遷移丟失,Update-Database命令會執行遷移。

NOTE:你也可以使用EF Core的命令行界面(CLI)來執行這些命令(http://mng.bz/454w)。第11章將會列出兩種命令VS 2017 和 CLI兩種版本的命令。此外,. net 2.1 還將引入全局工具,這將允許您通過正常命令調用這些命令行函數。

除了創建數據庫,migrations 命令的偉大之處在於,它們可以更新數據庫根據你的實體模型變化。如果你更改了實體模型或者應用DbContext的配置,Add- Migration會構建一系列命令來更新現有的數據庫。

儘管 ef core的遷移功能很有用, 但它並不涵蓋數據庫結構更改的所有類型。此外,對於某些項目,數據庫將在 ef core 之外定義和管理,這就意味著你不能使用EF Core的migrate特性。第11章探討了可用於數據庫遷移的選項,以及他們的利弊。

你的應用有多個項目怎麼辦

如果你的應用的DbContext的項目和你的啟動項目是獨立的(如本書的項目架構), Add-Migration命令稍微有一點複雜。

在圖書APP中,應用的DbContext在DataLayer項目中,而ASP.NET Core應用在EfCoreInAction項目中(本章稍後會解釋為什麼這樣設計)。若要添加EF Core 遷移, Add-Migration 命令如下:

Add-MgratonChapter02 -Project DataLayer -StartupProject

您還需要為遷移提供一種方法來創建一個應用的DbContext的實例。圖書APP的DbContext(EfCoreContext),有一個無參構造函數,所以Add-Migration命令會失敗。為了解決這個潛在的問題,Add-Migration會查找一個實現了IDesignTimeDbContextFactory泛型接口的類。這允許你提供類來創建一個正確配置的實例,以便Add-Migration可以工作,我們的實例中也是這樣做的。詳情查看http://mng.bz/7tYR.

參考

  • 《Entity Framework Core In Action》


分享到:


相關文章: