MVC - 模型驗證 && 模型類別

  • 5479
  • 0
  • 2018-01-11

此篇紀錄 EF 的模型驗證特性與模型類別。

依據模型驗證的特性在前端的View也會依據相關的設定產生出對應的驗證。

好站推薦 : 

定義資料模型的Metadata,常用Attribute

code first 開發第一步

ASP.net MVC Model篇—資料驗證


 

欄位名稱的屬性(Attributes)設定

範例 : 

public class TbStruct
{
    [Attributes]
    public int Id { get; set; };
}

相關特性 : 
  • [Key] : 該欄位為主索引鍵必須為Int的資料型態
  • [Index([name],[order],[IsClustered],[IsUnique]) : 
    a. name : 索引名稱。
    b. order : 多欄位時的順序
    c. IsClustered : 是否為叢集索引
    d. IsUnique : 是否為唯一索引
  • [Required] : 為必填
  • [Display(Name = "XXX")] : 此為在View中的模型可以使用的值。
  • [StringLength(3)] : 指定欄位長度 只能等於 3
  • [MaxLength(50)] : 欄位最大寬度為50適用於資料型態為 string
  • [NotMapped] : 欄位不需要建立於資料庫中。可能是特殊需求供程式內部使用
  • [Range(30, 300,ErrorMessage ="請輸入在預設範圍")] : 數字欄位的範圍做限制
  • [Compare("ColumnNmae")] : 比對兩個欄位值是否相同
  • [MembershipPassword] : 指定需要輸入高強度的密碼
  • ※[Remote(多載)] : 將該欄位的值透過Ajax的方式指定到特定方法來驗證

 

該屬性設定事告知Entity 這些欄位的值要特殊處理 : 

            [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
                該欄位的值在資料庫中有預設值,UPD時不異動該資料欄位
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)] :
                該欄位需要自動加序號的功能 類似[Key] 但不是主索引鍵
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
                該欄位雖然是 [Key] 但不讓它自動增加序號

 

建立 1 to N 或 N to N 關聯 :

    namespace Erp.Models
    {
        ///以下會產生一對多的情形 : 
        /// Member 1------->N Order

        public class Member
        {
            public virtual ICollection<Order> Order { get; set; } 
        }

        public class Order
        {
            public virtual Member Member { get; set; } 
        }
    }
    namespace Erp.Models
    {
        /// 以下會產生多對多的情形 : 
        /// Member 1------->N  [MemberAndOrder]  N<------1 Order

        public class Member
        {
            public virtual ICollection<Order> Order { get; set; } 
        }

        public class Order
        {
            public virtual ICollection<Member> Member { get; set; } 
        }
    }
使用關聯的好處,若在一對多的情形下如用linq對模型類別取值時不需要自己建立起關聯查詢,EF有延時查詢的機制主要關鍵點就是在 1toN,NtoN的欄位 關鍵字"virtual"

EX :

 using (Erp.Models.TbEntities db = new Erp.Models.TbEntities())
{
        // 使用N的那個表格可直接取得對應關聯資料表的值
        var value = db.Order.Member.ColumnName;
 }

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道