終於要講Database First了,這應該是目前大多人採用的方式,我開始學EF也是從Database First開始的,在開發專案之前,必須將專案需要用到的資料通通在資料庫定義好再來產生模型,所以先到SQL Server Management Studio(SSMS)裡面建立一個名稱為User的資料庫,並產生下列的資料表與欄位,實作一個使用者可以增加多個Email的功能,並解釋edmx內容以及說明如何更新模型。
1.新增一個MVC4專案,然後於加入Model資料夾加入ADO.NET實體資料類別(EF的基礎就是ADO.NET)
2.選擇從資料庫產生模型
3.新增連線,選擇資料庫來源
6.完成模型建立,產生.edmx檔案,這在上一篇Model First有提過,接下來會詳細說明這檔案的內容
可以按右鍵切到模型瀏覽器觀看實體與資料庫的目錄
9.UserModel.Context.tt,用來產生資料庫連線的程式碼產生器,可以裝tangible T4 Editor就會有highlight提示
下圖黃框說明此檔案為自動產生,不要手動修改,因為改了也會被蓋掉 = =,這邊將連線字串傳進去,可以想成資料庫連接,並且透過DataSet存取User與Email資料表
11.UserModel.tt,用來產生每一個模型的程式碼檔案,有幾個資料表就會產生幾個.cs類別檔
1.建立UserController
2.使用Scaffold產生CURD的範本,如果畫面出現沒有可用的模型,請記先建置或重建方案
模型選擇User,資料內容請選擇UserEntities,可以把它想成是連接資料庫
4.到SSMS中去檢查資料是否成功新增
接下來我們要說明,如果資料表欄位有異動要怎麼處理。
1.在User資料表新增一個Create_Date欄位,並設定預設值,記錄使用者新增的時間
2.開啟edmx設計畫面編輯entity,請在空白處按右鍵選擇重資料庫更新模型
5.瀏覽User/Create,新增一筆Dave資料,但卻發現Create_Date是NULL,阿不是已經設定預設值是getdate()了嗎!
詳細請參考這邊
7.再新增一筆Bob資料後,Create_Date值就正常了,想當初也是同事跟我講我才知道要這樣設定XD
2.瀏覽UserController發生錯誤,因為edmx已經mapping不到Name欄位
一樣按右鍵從資料庫更新模型後,會看到Acoount被加入了,但是Name欄位依然存在,是因為CSDL在變更與刪除不會連帶更新,所以點選Name按右鍵刪除,以前我跟同事的作法都是直接把entity給砍掉,重新加入,不然用更新總是覺得有點怪怪的
又發生錯誤... 因為我們的檢視頁面中會透過Model去讀取Name屬性的資料,所以不是只是刪除這個簡單而已,如果今天只是更改資料表的欄位名稱,難道要整個專案有用到的地方都去改嗎!是我一定會很想打那個改欄位名稱的人,所以如果有資料表欄位更名的情況,就建議不要透過資料庫更新模型了,自己手動改edmx定義檔還比較快
其實一開始用會覺得很難用,非常挫折,常常跑去煩同事XD,很多設定都不知道怎麼改,或是改了沒反應,若稍微了解edmx的XML架構之後也許對學習EF設計會比較有幫助