07 Model 介紹 - wycmaker/MVC-learning GitHub Wiki

Model職責

Model是實作資料邏輯的部分,在ASP.NET MVC專案中有關「資料」的部分都交由Model負責,其餘像是網站流程、頁面顯示等與資料不相關的工作都不該在Model中撰寫,以達到MVC強調的職責分離原則。Model在專案中的獨立性很高,不會受到Controller與View的影響,所以可以獨立寫成一個專案,讓多個ASP.NET MVC專案存取。

Model開發

在ASP.NET MVC中的Model開發會採用ORM技術,像是LINQ to SQL、Entity Framework等等,可以加速Model的開發,將重心放在物件的操作、資料的驗證與商業邏輯撰寫上,而不是專注在撰寫資料庫語法的部分。當Model越來越複雜後,會造成檔案的程式碼太過冗長,所以會將商業邏輯的部分獨立到Services資料夾中,讓Model專注在資料庫存取跟格式驗證上。

Code First 範例

  1. 建立專案

  1. 新增類別

在Models資料夾按右鍵→加入→選擇「類別」

點選「類別」→名稱設為GuestBook.cs→按下「新增」

建立GuestBook物件

public class GuestBook
{
    public int id { get; set; }
    public string name { get; set; }
    public string content { get; set; }
}

按下「建置」→「建置方案」

  1. 新增Controller

在Controllers資料夾按右鍵→加入→選擇「控制器」

選擇「具有檢視、使用Entity Framework的MVC5控制器」

設定資料內容類別

設定完成後,按「加入」按鈕,會自動產生Controller與View

  1. 測試成果

輸入https://localhost:44381/GuestBooks進入頁面

新增一筆資料

觀看新增成功的結果

  1. 自動產生的資料表定義

Code First 資料模型屬性

注意: 需引用命名空間

using System.ComponentModel.DataAnnotations;//一般屬性
using System.ComponentModel.DataAnnotations.Schema;//設定資料表名稱必須

下列是Code First 資料模型常用的屬性:

  1. Table:Code First在將類別轉換成資料庫時,如果沒有特別設定名稱,資料表的名稱會與類別相同,若要使用自訂的資料表名稱,則可以使用Table屬性
    [Table("MyGuestbook")]
    public class GuestBook
    {
        public int id { get; set; }
        public string name { get; set; }
        public string content { get; set; }
    }
  1. Key:被用來宣告資料表的主索引鍵,資料表的預設主索引鍵名稱是Id,若類別內沒有Id屬性,又沒有設定主索引鍵的話,在自動建立資料表的時候會發生錯誤
    [Table("MyGuestbook")]
    public class GuestBook
    {
        [Key]
        public int id { get; set; }
        public string name { get; set; }
        public string content { get; set; }
    }
  1. 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; }
    }
  1. 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; }
    }
  1. 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# )

⚠️ **GitHub.com Fallback** ⚠️