07 Model 介紹 - wycmaker/MVC-learning GitHub Wiki
Model是實作資料邏輯的部分,在ASP.NET MVC專案中有關「資料」的部分都交由Model負責,其餘像是網站流程、頁面顯示等與資料不相關的工作都不該在Model中撰寫,以達到MVC強調的職責分離原則。Model在專案中的獨立性很高,不會受到Controller與View的影響,所以可以獨立寫成一個專案,讓多個ASP.NET MVC專案存取。
在ASP.NET MVC中的Model開發會採用ORM技術,像是LINQ to SQL、Entity Framework等等,可以加速Model的開發,將重心放在物件的操作、資料的驗證與商業邏輯撰寫上,而不是專注在撰寫資料庫語法的部分。當Model越來越複雜後,會造成檔案的程式碼太過冗長,所以會將商業邏輯的部分獨立到Services資料夾中,讓Model專注在資料庫存取跟格式驗證上。
- 建立專案
- 新增類別
在Models資料夾按右鍵→加入→選擇「類別」
點選「類別」→名稱設為GuestBook.cs→按下「新增」
建立GuestBook物件
public class GuestBook
{
public int id { get; set; }
public string name { get; set; }
public string content { get; set; }
}
按下「建置」→「建置方案」
- 新增Controller
在Controllers資料夾按右鍵→加入→選擇「控制器」
選擇「具有檢視、使用Entity Framework的MVC5控制器」
設定資料內容類別
設定完成後,按「加入」按鈕,會自動產生Controller與View
- 測試成果
輸入https://localhost:44381/GuestBooks
進入頁面
新增一筆資料
觀看新增成功的結果
- 自動產生的資料表定義
注意: 需引用命名空間
using System.ComponentModel.DataAnnotations;//一般屬性
using System.ComponentModel.DataAnnotations.Schema;//設定資料表名稱必須
下列是Code First 資料模型常用的屬性:
-
Table
:Code First在將類別轉換成資料庫時,如果沒有特別設定名稱,資料表的名稱會與類別相同,若要使用自訂的資料表名稱,則可以使用Table
屬性
[Table("MyGuestbook")]
public class GuestBook
{
public int id { get; set; }
public string name { get; set; }
public string content { get; set; }
}
-
Key
:被用來宣告資料表的主索引鍵,資料表的預設主索引鍵名稱是Id
,若類別內沒有Id
屬性,又沒有設定主索引鍵的話,在自動建立資料表的時候會發生錯誤
[Table("MyGuestbook")]
public class GuestBook
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string content { get; set; }
}
-
Required
:宣告資料表中的必填欄位,等同於在建立資料表定義時,將欄位設定為NOT NULL,若要定義允許NULL的欄位,可以在屬性的型別後加上?
[Table("MyGuestbook")]
public class GuestBook
{
[Key]
[Required]
public int id { get; set; }
[Required]
public string name { get; set; }
[Required]
public string content { get; set; }
public DateTime? created_time { get; set; }
}
-
MaxLength
:類別中的string屬性可以透過MaxLength
來限定字串的長度
[Table("MyGuestbook")]
public class GuestBook
{
[Key]
[Required]
public int id { get; set; }
[Required]
[MaxLength(20)]
public string name { get; set; }
[Required]
[MaxLength(200)]
public string content { get; set; }
public DateTime? created_time { get; set; }
}
-
NotMapped
:如果類別中有屬性不想被一起建立在資料表中,可以使用NotMapped
屬性
[Table("MyGuestbook")]
public class GuestBook
{
[Key]
[Required]
public int id { get; set; }
[Required]
[MaxLength(20)]
public string name { get; set; }
[Required]
[MaxLength(200)]
public string content { get; set; }
public DateTime? created_time { get; set; }
[NotMapped]
public string board { get; set; }
}
結果:
設定關聯性:
public ICollection<類別名稱> 欄位名稱 { get; set; }
關於Code First的資料模型屬性還有許多沒有用到的,可以根據類別的需求,自行增加或減少,這裡只做簡單的介紹。
書籍:ASP.NET MVC 4 開發實戰
書籍:一次就懂 ASP.NET MVC 5.x 網站開發:Web應用的經典實務範例解析(Visual C# )