2017年7月29日 星期六

C# Entity Framework,Code First ,欄位屬性 

因為某些原因所以寫篇文章

上篇我提到使用Entity Framework去抓取pgSQL
也提到我參考一篇 code first的文章去做
後來實務上需要新增資料表,所以我決定玩玩看code first的作法





基本操作上其實都沒甚麼問題
實作部分可以參考這兩篇

Entity Framework - 使用Code First模式 Ver 5.0

Entity Framework Code First For PostgreSQL

可是產生出來之後,由於沒有定義欄位屬性
在pgSQL裡面,字串的部分它變成了text...

好,那要如何操作呢?

我們首先來看看一些比較基本的

KEY

使用key,可以讓那個欄位變成主鍵

    public class UserInfo
    {
        [Key]
        public int id { get; set; }
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }


當然,也可以雙主鍵
可是雙主鍵要有先後順序,不然會有錯誤

    public class UserInfo
    {
        [Key]
        [Column(Order=1)]
        public int id { get; set; }
        [Key]
        [Column(Order = 2)]
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }


Index

有KEY當然也可以有索引鍵
注意要自訂名稱

    public class UserInfo
    {
        [Key]
        public int id { get; set; }
        [Index("user_info_index")]
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }




NOT NULL

使用Required
可以讓欄位變成必填



    public class UserInfo
    {
        [Key]
        public int id { get; set; }
        [Required]
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }


長度

資料庫一定會有限制長度的時候
可以使用MaxLength,還有另一個比較奇妙的MinLength

    public class UserInfo
    {
        [Key]
        public int id { get; set; }
        [Required]
        public string user_id { get; set; }//使用者帳號 
        [MaxLength(100),MinLength(5)]
        public string user_name { get; set; }//使用者名稱

    }


Table and Column

也可以自訂資料表與欄位名稱,不要跟Model一樣
前綴的Schema 也可以動



    [Table("user_info", Schema = "public")]
    public class UserInfo
    {
        [Key]
        [Column("user_id")]
        public int id { get; set; }
        public string user_id { get; set; }//使用者帳號 
        public string user_name { get; set; }//使用者名稱

    }


還有個比較特別的

自訂欄位型態

    [Table("user_info", Schema = "public")]
    public class UserInfo
    {
        [Key]
        [Column("user_id")]
        public int id { get; set; }
        [Column(TypeName="nchar")] 
        public string user_id { get; set; }//使用者帳號 
        [Column(TypeName="nvarchar")] 
        public string user_name { get; set; }//使用者名稱

    }


既然是關聯資料庫,那一定有外來鍵
不過我自己的使用習慣上,從來沒有使用過外來鍵,所以就放個外部連結給各位參考拉

--------------------------------------------------------------

會有這麼多東西,主要還是因為也不可能每次產生資料表之後,再進去資料庫去處理欄位屬性,會非常的麻煩
那要如何處理呢,就是這些attribute來處理了
另外值得一提的是,每種資料庫都不太一樣
雖然使用上都差不多,不過最大差異應該還是TypeName與預設Schema
使用的時候要多注意一下

另外還有個default的部分比較麻煩,我在這邊貼個 overflow的文章給各位參考

Entity Framework 6 Code first Default value



參考資料:

Entity Framework Code First Data Annotations
Code First Conventions

沒有留言:

張貼留言