【筆記】Entity Framework 使用來自資料庫的 Code First 與問題紀錄

最近練習寫 asp.net MVC 後,開始著手使用 Entity Framework。先學習如何使用 Code First 建立資料庫,一直到目前開始測試使用「來自資料庫的 Code First」加入以前既有的資料庫,也在此遇到一個問題:「有些資料表沒有 Primary Key 欄位」。此篇記錄使用「來自資料庫的 Code First」的操作步驟與遇到的問題。

之前的狀況都是在空專案上練習使用 Entity Framework(以下稱 EF) 的 Code First,來操作資料庫中的資料。現在要將以往工作上既有的資料庫加入到使用 EF 的專案中,為了可以一致使用 Code First,所以利用了 Visual Studio 功能中的「來自資料庫的 Code First」,將既有的資料表轉為 EF Model,操作步驟如下:

1. 首先在專案中加入新項目,選擇「ADO.NET 實體資料模型」

2. 建置過程中,選擇「來自資料庫的 Code First」

3. 使用「新增連結」設定好資料庫的連結(因為此專案為測試使用,所以這裡不調整其它設定)

4. 勾選要轉成 Model 的資料表,開始建置

5. 建置成功後,產生一支繼承 DbContext 的 Class 檔,以及所選取資料表轉成 Model 的 Class 檔

6. 建置專案的 Migrations 目錄,開啟「套件管理器主控台」

7. 在命令視窗中鍵入 Enable-Migrations 接著工具就會自動將移轉啟用與產生 Migrations 目錄

8. 接著在鍵入 Add-Migration InitialCreate -IgnoreChanges 其中 InitialCreate 是自行命名的名稱(建議是有意義的命名,如敘述這次的操作內容),送出指令後會產生出一筆含此命名的 Class 檔案,此檔案內容是處理接著要變更資料庫內容的 Migration 檔案,而 -IgnoreChanges 部分則是註記這次產生出的 Migration 檔案,要忽略 Model 的異動。會在這裡加上 -IgnoreChanges 是因為這是第一次從 Database 轉成 Code First Model,在我的測試遇到的狀況是,透過「ADO.NET 實體資料模型」產生的僅是既有資料庫轉成的 Model,也就是只是一份對這個資料庫的敘述檔案,所以若是沒加 -IgnoreChanges,這個工具就會當作這是第一次使用 Code First Model 來建置一個全新的資料庫,而生成寫有 Create Table 等方法的 Migration 檔案,所以這邊才需要註記忽略變更

(因為忽略變更,所以得到的是一份沒有執行任何動作的 Migration 檔案)

9. 在命令工具中鍵入 Update-Database 更新資料庫,雖然上的步驟產生的 Migration 沒有執行任何動作,但每當產生出一筆 Migration 即需要執行一次 Update-Database,否則下次產生 Migration 時,會提示尚未處理前次的 Migration 操作,而阻止你建立新的 Migration

上述步驟完成既有資料庫轉成 Code First 的 Model,但這過程中遇到一個問題,在設置過程中,還有選擇一項「行事曆」的資料表,怎麼沒有被轉換出來呢?原因是因為該資料表,沒有 Primary Key,EF 需要有 Primary Key 來才能執行資料的新增、修改以及刪除,所以當需要透過「來自資料庫的 Code First」這個功能建立 Code First Model 時,記得 Table 和 View 要有設置 Primary Key。


參考資料:

https://stackoverflow.com/questions/15381233/can-we-have-table-without-primary-key-in-entity-framwork

https://stackoverflow.com/questions/3996782/entity-framework-table-without-primary-key