iT邦幫忙

DAY 23
0

在錯誤中學習ASP.NET MVC系列 第 23

認識Model - Database First 與 .edmx檔

  • 分享至 

  • xImage
  •  

終於要講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設計會比較有幫助


上一篇
認識Model - Model First
下一篇
認識Model - 使用MetaData設定欄位資訊與驗證
系列文
在錯誤中學習ASP.NET MVC30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言