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 至現有的資料庫
- 一開始一樣需要再 DBContext 專案使用套件管理主控台輸入 Enable-Migrations
- (重要) 這時候要先產生第一版,但資料庫已經存在,因此要在 Add-Migration 後面加上參數 -IgnoreChanges( EX Add-Migration Init -IgnoreChanges)
- 接著執行 Update-Database, 在資料庫產生__MigrationHistory
- 接著操作都一樣。
資料庫初始化策略
資料庫初始化策略為當實體模型 Entity 發生改變,資料庫如何重新初始化。
預設提供五種初始化策略 (2017-01-23 更新補充):
- 當站台啟動時檢查資料庫的__Migration 和程式,不同則更新 Schema : MigrateDatabaseToLatestVersion
- 資料庫不存在時自動建立 :CreateDatabaseIfNotExists
- 當實體模型發生變化時自動重建資料庫 (砍掉重練) :DropCreateDatabaseIfModelChanges
- 每次啟動專案都自動重建資料庫 (砍掉重練) :DropCreateDatabaseAlways
- 自訂資料庫初始化策略
建議使用 MigrateDatabaseToLatestVersion,因為如果使用其他的,必須在 Visual Studio 的套件管理器主控台,執行 Update-Database 指令,才會更新 Schema, 而在 DB 端目前不知道有甚麼方法執行,因此使用 MigrateDatabaseToLatestVersion 讓 DB 自動去更新到最後的 Migration 版本。
設定方式可將下面語法寫在 DbContext 的建構式中
參數也可帶入 null 關閉資料庫初始化策略