從EF4.1開始,EF能夠支持CodeFirst開發模式,這種開發模式特別適用於領域驅動設計(Domain Driven Design,大名鼎鼎的DDD)。在CodeFirst模式中,咱們再也不先建立數據庫,而後在程序中建立對應的類;CodeFirst開發模式中咱們只關注應用程序的域(Domain)直接開始建立類,EF會根據咱們建立的類自動生成數據庫。sql
CodeFirst的工做流程以下所示:數據庫
使用CodeFirst模式進行開發時,咱們的開發流程是:建立/修改領域類-->配置領域類(使用Fluent API或者註釋屬性)-->新建/修改數據庫架構(使用自動遷移或者代碼遷移)架構
添加一個名字爲EF6Console的控制檯應用程序,而後把EF引入到項目中,以下圖:函數
添加了EF後咱們就能夠就行EF的CoreFirst開發了sqlserver
首先添加兩個Student和Grade類(學生和年紀),它們是一對多關係,一個年級有多個學生,而一個學生只能有一個年級,代碼以下:spa
public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public DateTime? DateOfBirth { get; set; } public byte[] Photo { get; set; } public decimal Height { get; set; } public float Weight { get; set; } public Grade Grade { get; set; } }
public class Grade { public int GradeId { get; set; } public string GradeName { get; set; } public string Section { get; set; } public ICollection<Student> Students { get; set; } }
CodeFirst模式也須要一個context上下文類,和DbFirst開發不一樣,在CodeFirst模式中context類須要咱們本身建立,context類繼承DbContext,代碼以下:設計
public class SchoolContext : DbContext { //構造函數 public SchoolContext() : base() { } //每一個類設置一個的DbSet屬性 public DbSet<Student> Students { get; set; } public DbSet<Grade> Grades { get; set; } }
完成了這兩步,SqlServer的CodeFirst簡單入門就結束了,是否是特別方便?code
咱們在程序中添加一個Student,代碼以下:server
class Program { static void Main(string[] args) { using (var ctx=new SchoolContext()) { Student student = new Student() { StudentName = "bill" }; ctx.Students.Add(student); ctx.SaveChanges(); Console.WriteLine("初始化完成"); } } }
執行後數據庫就自動建立了,以下圖所示blog
由於沒有添加任何關於context的設置,因此EF安裝默認規則在vs內置的sqlserver中給咱們建立了 數據庫,名字是EF6Console.SchoolContext(項目名.上下文名),同時給Student和Grade領域類生成了dbo.Students和dbo.Grades(dbo.class複數)表。表中的每一個列對應類的屬性,後綴有Id(如studentId)的設置爲主鍵和外鍵,實體實例生成了數據庫的記錄。當切換到CodeFirst開發時,感受整個項目看起來都清爽了~
注意:這時若是修改類(如Student類)的話,運行程序時會拋出異常。如咱們把Student類的體重屬性註釋了,以下所示
public class Student { public int StudentId { get; set; } public string StudentName { get; set; } public DateTime? DateofBirth { get; set; } public byte[] Photo { get; set; } public decimal Height { get; set; } //public float Weight { get; set; } public Grade Grade { get; set; } }
而後運行程序,出現
這時由於領域類(Student)改變了致使數據庫中dbo.Students表的列也要隨着改變,這就須要咱們定義一個數據庫的遷移策略(database initialization strategy),在之後的章節會介紹。