在錯誤中學習ASP.NET MVC 第 23 篇 - 認識Model - Database First 與 .edmx檔

 終於要講Database First了,這應該是目前大多人採用的方式,我開始學EF也是從Database First開始的,在開發專案之前,必須將專案需要用到的資料通通在資料庫定義好再來產生模型,所以先到SQL Server Management Studio(SSMS)裡面建立一個名稱為User的資料庫,並產生下列的資料表與欄位,實作一個使用者可以增加多個Email的功能,並解釋edmx內容以及說明如何更新模型。





建立模型

1.新增一個MVC4專案,然後於加入Model資料夾加入ADO.NET實體資料類別(EF的基礎就是ADO.NET)



2.選擇從資料庫產生模型





3.新增連線,選擇資料庫來源





4.產生一個名稱為UserEntities的連線字串





  1. 選擇要加入的資料表


6.完成模型建立,產生.edmx檔案,這在上一篇Model First有提過,接下來會詳細說明這檔案的內容



可以按右鍵切到模型瀏覽器觀看實體與資料庫的目錄



7.使用xml方式開啟.edmx檔案





  1. 觀察.edmx,在runtime時由三個部份組成,這邊就可以觀察到ORM
    SSDL:定義實體資料庫,例如資料表或預存程序
    CSDL:定義模型類別,一個類別稱為一個Entity
    MSL(C-S Mapping):對應資料庫Table與Entity物件





9.UserModel.Context.tt,用來產生資料庫連線的程式碼產生器,可以裝tangible T4 Editor就會有highlight提示



下圖黃框說明此檔案為自動產生,不要手動修改,因為改了也會被蓋掉 = =,這邊將連線字串傳進去,可以想成資料庫連接,並且透過DataSet存取User與Email資料表



  1. UserModel.edmx.diagram 用來定義edmx設計畫面entity在畫面上的位置


11.UserModel.tt,用來產生每一個模型的程式碼檔案,有幾個資料表就會產生幾個.cs類別檔







建立Controller

1.建立UserController





2.使用Scaffold產生CURD的範本,如果畫面出現沒有可用的模型,請記先建置或重建方案





模型選擇User,資料內容請選擇UserEntities,可以把它想成是連接資料庫



  1. 瀏覽User/Create,新增一個名稱為Alice的User


4.到SSMS中去檢查資料是否成功新增



更新模型 - 新增欄位

接下來我們要說明,如果資料表欄位有異動要怎麼處理。

1.在User資料表新增一個Create_Date欄位,並設定預設值,記錄使用者新增的時間



2.開啟edmx設計畫面編輯entity,請在空白處按右鍵選擇重資料庫更新模型



3.切換到重新整理頁籤,選擇要更新的資料表User



  1. User Entity已經加入Create_Date欄位了


5.瀏覽User/Create,新增一筆Dave資料,但卻發現Create_Date是NULL,阿不是已經設定預設值是getdate()了嗎!



  1. 修改Create_Date的屬性(案F4會出現屬性視窗),將StoreGeneratedPattern改成Compute


詳細請參考這邊



7.再新增一筆Bob資料後,Create_Date值就正常了,想當初也是同事跟我講我才知道要這樣設定XD



更新模型 - 修改欄位

1.把User資料表中Name更名為Acoount



2.瀏覽UserController發生錯誤,因為edmx已經mapping不到Name欄位



  1. 一樣按右鍵從資料庫更新模型後,會看到Acoount被加入了,但是Name欄位依然存在,是因為CSDL在變更與刪除不會連帶更新,所以點選Name按右鍵刪除,以前我跟同事的作法都是直接把entity給砍掉,重新加入,不然用更新總是覺得有點怪怪的



  2. 又發生錯誤... 因為我們的檢視頁面中會透過Model去讀取Name屬性的資料,所以不是只是刪除這個簡單而已,如果今天只是更改資料表的欄位名稱,難道要整個專案有用到的地方都去改嗎!是我一定會很想打那個改欄位名稱的人,所以如果有資料表欄位更名的情況,就建議不要透過資料庫更新模型了,自己手動改edmx定義檔還比較快



  3. 修改edmx中的SSDL與C-S Mapping,就大功告成,一行code都免改





其實一開始用會覺得很難用,非常挫折,常常跑去煩同事XD,很多設定都不知道怎麼改,或是改了沒反應,若稍微了解edmx的XML架構之後也許對學習EF設計會比較有幫助


留言

這個網誌中的熱門文章

CPE 一顆星選集題目說明與解答 - Java 筆記與心得分享

Visual Studio 自動排版格式化程式碼

1. Vito's family (CPE10406, UVA10041) - CPE一顆星解答與說明