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


系列文章

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

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

本節導航

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

  爲了建立數據庫,你須要執行操做:web

  • 定義應用的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》

使用場景

相關文章
相關標籤/搜索