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



系列文章

EF Core 快速上手——EF Core 入門

EF Core 快速上手——EF Core的三種主要關系類型

本節導航

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

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

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

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

2.2.1 定義應用的DbContext: EfCoreContext

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

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

使用場景

  圖2.6中,值得注意的一點是,應用的DbContext沒有包含Review實體和BookAuthor實體的DbSet 屬性。這是因為這兩個實體類只能通過 book 類訪問,稍后你會看到。

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。

使用場景

  在清單的末尾,你在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 還將引入全局工具,這將允許您通過正常命令調用這些命令行函數。

  替代使用Update-Database命令的方式是在你應用的startup代碼中調用context.Database.Migrate方法。這種方法對於承載的 asp. net core web 應用程序非常有用;第5章將包含這個選項,包括它的一些限制。

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

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

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

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

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

Add-Migration Chapter02 -Project DataLayer -StartupProject

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

參考

  •   《Entity Framework Core In Action》

使用場景


免責聲明!

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



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