从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),在之后的章节会介绍。