CodeFirst

Code First

為什麼要使用 Code First

其實 Code First 就是另一種關注點分離:

當我們在開發程式時,以往的 DB First 在開發的流程是什麼?

  • 首先我們建立 / 修改資料庫或 Table
  • 接著新增 / 更新實體資料模型 (.edmx)
  • 使用 DbContext 對資料庫做 CRUD 來開發程式

以上步驟確實也不繁瑣,但往往開發程是到一半,發現資料庫的欄位,對應等需要做修改,我們需要再去資料庫修改,再次更新實體資料模型,而如我們公司的開發習慣,測試機建立好 Table 習慣性就會在 正式機 \ 對外測試機 先把 Table 建立,這時通常為了避免佈署時忘記更新,通常也會一併做修改,這一來一往做的事情,就繁瑣許多。

如果我們選擇用 Code First 開發,在開發時先不考慮資料庫內發生甚麼事,把需要的資料表和對應,在 Entity class 和 DbContext 中宣告好,接著就專注於 Business Logic 的開發,一旦發現資料模型需要更動,直接修改 Entity class,等到程式執行由 Code First 建立 / 修改 Table 就可以省去這些不斷開 SSMS 修改的麻煩步驟。

 

其上面的  modelBuilder.Conventions.Remove<PluralizingTableNameConvention>() 不建立複數名稱

--------------------------------------------------------

建立 Migration

Enable-Migrations

當程式開發到一定階段,開始需要去對資料庫做操作,則可以在套件管理主控 (檢視 -> 其他室窗 ->套件管理主控台),先在上方下拉選單選擇 Data Access Layer 專案,輸入 Enable-Migrations 啟用 Migration 功能,這時專案內會多出一個 Migrations 資料夾,內涵一個 Config

Add-Migration

當 Entity 做出修改,在套件管理主控台會輸入 Add-Migration [MigrationName]

這時 Migrations 資料夾會建立一個差異檔 日期_MigrationName.cs,最後佈署程式就 DB 就會由差異檔去幫你更動資料庫 Schema,而不需要手工去修改正式機

Update-Database

新增完異動檔後,即可在在套件管理主控台執行 Update-Database,他會幫你建立把差異檔更動到 DbContext 對應的 DB 上去修改 Schema


Get-Migrations

取得所有的異動檔版本

套用 Code First 至現有的資料庫

  1. 一開始一樣需要再 DBContext 專案使用套件管理主控台輸入 Enable-Migrations
  2. (重要) 這時候要先產生第一版,但資料庫已經存在,因此要在 Add-Migration 後面加上參數 -IgnoreChanges( EX Add-Migration Init -IgnoreChanges)
  3. 接著執行 Update-Database, 在資料庫產生__MigrationHistory
  4. 接著操作都一樣。

資料庫初始化策略

資料庫初始化策略為當實體模型 Entity 發生改變,資料庫如何重新初始化。

預設提供五種初始化策略 (2017-01-23 更新補充):

  • 當站台啟動時檢查資料庫的__Migration 和程式,不同則更新 Schema : MigrateDatabaseToLatestVersion
  • 資料庫不存在時自動建立 :CreateDatabaseIfNotExists
  • 當實體模型發生變化時自動重建資料庫 (砍掉重練) :DropCreateDatabaseIfModelChanges
  • 每次啟動專案都自動重建資料庫 (砍掉重練) :DropCreateDatabaseAlways
  • 自訂資料庫初始化策略

建議使用 MigrateDatabaseToLatestVersion,因為如果使用其他的,必須在 Visual Studio 的套件管理器主控台,執行 Update-Database 指令,才會更新 Schema, 而在 DB 端目前不知道有甚麼方法執行,因此使用 MigrateDatabaseToLatestVersion 讓 DB 自動去更新到最後的 Migration 版本。

設定方式可將下面語法寫在 DbContext 的建構式中

參數也可帶入 null 關閉資料庫初始化策略