EF 6 Code-First系列文章目錄:
- 1 翻譯系列:什么是Code First(EF 6 Code First 系列)
- 2.翻譯系列:為EF Code-First設置開發環境(EF 6 Code-First系列)
- 3.翻譯系列:EF Code-First 示例(EF 6 Code-First系列)
- 4.翻譯系列:EF 6 Code-First默認約定(EF 6 Code-First系列)
- 5.翻譯系列:EF 6中數據庫的初始化(EF 6 Code-First 系列)
- 6.翻譯系列:EF 6 Code-First中數據庫初始化策略(EF 6 Code-First系列
- 7.翻譯系列:EF 6中的繼承策略(EF 6 Code-First 系列)
- 8.翻譯系列: EF 6中配置領域類(EF 6 Code-First 系列)
- 9.翻譯系列:EF 6以及EF Core中的數據注解特性(EF 6 Code-First系列)
- 9.1 翻譯系列:數據注解特性之----Table【EF 6 Code-First 系列】
- 9.2 翻譯系列:數據注解特性之---Column【EF 6 Code First系列】
- 9.3 翻譯系列:數據注解特性之Key【EF 6 Code-First 系列】
- 9.4 翻譯系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
- 9.5 翻譯系列:數據注解之ForeignKey特性【EF 6 Code-First系列】
- 9.6 翻譯系列:數據注解之Index特性【EF 6 Code-First系列】
- 9.7 翻譯系列:EF數據注解特性之--InverseProperty【EF 6 Code-First系列】
- 9.8 翻譯系列:數據注解特性之--Required 【EF 6 Code-First系列】
- 9.9 翻譯系列:數據注解特性之--MaxLength 【EF 6 Code-First系列】
- 9.10 翻譯系列:EF數據注解特性之StringLength【EF 6 Code-First系列】
- 9.11 翻譯系列:數據注解特性之--Timestamp【EF 6 Code-First系列】
- 9.12 翻譯系列:數據注解特性之ConcurrencyCheck【EF 6 Code-First系列】
- 10.翻譯系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
- 10.1.翻譯系列:EF 6中的實體映射【EF 6 Code-First系列】
- 10.2.翻譯系列:使用Fluent API進行屬性映射【EF 6 Code-First】
- 11.翻譯系列:在EF 6中配置一對零或者一對一的關系【EF 6 Code-First系列】
- 12.翻譯系列:EF 6 中配置一對多的關系【EF 6 Code-First系列】
- 13.翻譯系列:Code-First方式配置多對多關系【EF 6 Code-First系列】
- 14.翻譯系列:從已經存在的數據庫中生成上下文類和實體類【EF 6 Code-First系列】
- 15.翻譯系列:EF 6中的級聯刪除【EF 6 Code-First 系列】
- 16.翻譯系列:EF 6 Code -First中使用存儲過程【EF 6 Code-First系列】
- 17.翻譯系列:將Fluent API的配置遷移到單獨的類中【EF 6 Code-First系列】
- 18.翻譯系列:EF 6 Code-First 中的Seed Data(種子數據或原始測試數據)【EF 6 Code-First系列】
- 19.翻譯系列:EF 6中定義自定義的約定【EF 6 Code-First約定】
- 20.翻譯系列:Code-First中的數據庫遷移技術【EF 6 Code-First系列】
- 20.1翻譯系列:EF 6中自動數據遷移技術【EF 6 Code-First系列】
- 20.2.翻譯系列:EF 6中基於代碼的數據庫遷移技術【EF 6 Code-First系列】
- 21.翻譯系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
Column特性,可以應用於實體的一個或者多個屬性上面,用來配置數據庫中數據表中列的列名、列的數據類型以及列的先后順序。Column特性重寫了默認的約定。按照EF 6和EF Core中的默認約定,將會創建和屬性相同的列名稱,並且數據表,列的順序和實體中屬性的順序一致。
Column Attribute: [Column (string name, Properties:[Order = int],[TypeName = string])
name:表的數據列的名稱
Order:列的順序,從索引0開始【可選的】
TypeName:列的類型名稱【可選的】
下面的例子,改變了一個列的名稱:
在上面的例子中,我們在StudentName屬性上應用Column特性,所以EF將會重寫默認約定,為我們創建一個名稱為Name的數據列,而不是StudentName數據列:
列的數據類型
可以使用Column特性中的TypeName參數,來指定列的數據類型,如下:
在上面的例子中,我們在DataOfBirth屬性上,設置了TypeName參數值為DataTime2,然后就會為我們生成類型為DataTime2的列,而不是DateTime類型的列。
列的先后順序
使用從索引0開始的Order參數,來設置數據庫中列的順序。按照默認約定,主鍵列會是第一個,然后其他的列的順序,就是基於屬性在實體中的先后順序了。
注意:Order參數必須要應用在實體的所有屬性上面,並且索引數不能有一樣的,索引從0開始。
上面的例子,將會在數據庫中,生成這樣的順序的列:
好了,理論介紹完了,我們何不動手實踐一下?
1.創建一個名稱為EFAnnotationColumn的控制台應用程序。
2.安裝EF【Install-Package EntityFramework -Version 6.2.0】
3.創建一個Book類:
public class Book { public int BookID { get; set; } public string BookName { get; set; } public string AuthorName { get; set; } public DateTime PublishedDate { get; set; } public decimal Price { get; set; } }
4.創建一個上下文類:BookContext
public class BookContext:DbContext { public BookContext():base("name=Constr") { Database.SetInitializer<BookContext>(new DropCreateDatabaseAlways<BookContext>()); } public DbSet<Book> Books { get; set; } }
5.SQL連接字符串:
<connectionStrings>
<add name="Constr" connectionString="Server=.;Database=EFAnnotationColumnDB;uid=sa;pwd=Password_1" providerName="System.Data.SqlClient"/>
</connectionStrings>
6.測試代碼:
class Program { static void Main(string[] args) { using (var db = new BookContext()) { Book bookModel = new Book() { BookName = "西游記", AuthorName = "吳承恩", PublishedDate = DateTime.Now.AddYears(-200), Price=109.99M }; db.Entry(bookModel).State = System.Data.Entity.EntityState.Added; db.SaveChanges(); } Console.WriteLine("添加數據成功"); Console.ReadKey(); } }
運行代碼:
我們看看數據庫:
可以看到默認約定,為我們生成了數據庫以及數據表Books,列的順序就和實體中屬性先后順序一樣。
我們來修改一下Book實體:
然后運行項目:可以看到BookName字段名稱,經過配置,生成了名稱為BookTitle列。
我們再修改一下Book實體:
接着運行程序;看到PublishedDate列的數據類型成了我們配置的Date。
再修改一下Book實體:
public class Book { [Column(Order =3)] public int BookID { get; set; } [Column("BookTitle",Order =4)] public string BookName { get; set; } [Column(Order =1)] public string AuthorName { get; set; } [Column(TypeName ="Date",Order =0)] public DateTime PublishedDate { get; set; } [Column(Order =2)] public decimal Price { get; set; } }
我們使用數據注解,配置列的順序是:PublishedDate -->AuthorName-->Price-->BookID-->BookName.那么實際上是不是這樣呢,我們運行項目:
可以看到,列的順序就是按照我們配置的這樣。
有個疑問,上面說到,配置列的順序的時候,必須對所有的列,都應用於Column的Order參數。我們來看看一個反例:
修改Book實體:
public class Book { [Column(Order =3)] public int BookID { get; set; } public string BookName { get; set; } [Column(Order =1)] public string AuthorName { get; set; } [Column(TypeName ="Date",Order =0)] public DateTime PublishedDate { get; set; } public decimal Price { get; set; } }
上面我們移除了BookName屬性和Price屬性的Column特性,沒有設置Order。我們運行看看:
可以看到,EF是按照有設置Order參數的順序來的,第一個是索引為0 的PublishedDate,第二個是索引為1的AuthorName,第三個就是索引為3的BookID了,然后后面兩個就是按照他們在實體中的順序來的了。
我們再改一下,只對一個屬性設置Order,看看:
public int BookID { get; set; }
public string BookName { get; set; }
public string AuthorName { get; set; }
public DateTime PublishedDate { get; set; }
[Column(Order = 3)]
public decimal Price { get; set; }
上面代碼,只對Price屬性設置了Order,索引為3,我們運行看看:【可以看到Price成為了第一個列,排在最前面,然后后面的列的順序,就是按照屬性在實體中的先后順序了。】
好了,這篇文章就介紹完了,主要講解了數據注解特性之---Column,值得注意的是,當配置列的順序的時候,必須對所有的列都應用於Column特性中的Order參數標記,索引從0開始,切記!!!