EFCodeFirst模式使用的是约定大于配置的编程模式,这种模式利用默认约定根据我们的领域模型建立概念模型.然后我们也可以通过配置领域类来覆盖默认约定. 覆盖默认约定主要用两种手段: 1.数据注释属性(Data Annotations Attributes) 2.FluentAPI 1.数据注释属性 我们可以给领域类或者类的属性添加数据注释属性来实现覆盖默认约定,其实在MVC webApi中也会经常用到数据注释属性.一个栗子 [Table("StudentInfo",Schema =…
这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通过数据注释属性配置1对0/1关系 我们将要实现一个Student和StudentAddress实体的1对0/1关系,1对0/1关系指的是一个Student可有一个或者零个住址StudentAddress,但是一个StudentAddress必须对应一个Student.在数据库中表现形式是Studen…
FluentApi配置存储过程 1.EF自动生成存储过程 EF6的CodeFirst开发模式支持给实体的CUD操作配置存储过程,当我们执行SaveChanges()方法时EF不在生成INSERT,UPDATE,DELETE命令,而是生成CUD操作的存储过程,我们也可以给实体CUD操作指定自定义的存储过程. 一个栗子: 我们给学生实体的CUD操作设置存储过程,Student实体如下: class Student { public int StudentId { get; set; } public…
FluentApi总结 1.FluentApi简介 EF中的FluentApi作用是通过配置领域类来覆盖默认的约定.在EF中,我们通过DbModelBuilder类来使用FluentApi,它的功能比数据注释属性更强大. 使用FluentApi时,我们在context类的OnModelCreating()方法中重写配置项,一个栗子: public class SchoolContext: DbContext { public DbSet<Student> Students { get; set…
上一篇<Entityframework Code First 系列之项目搭建>讲了搭建一个Code First的控制台项目.里面有一些内容并没有扩展出来讲,因为篇幅有限.这篇针对上面内容中实体类的定义来讲下数据注释. 来看下Company的定义: public class Company { public long Id { get; set; } [DisplayName()] public string Name { get; set; } [DisplayName("描述&qu…
1. CodeFirst的默认约定 1.领域类和数据库架构的映射约定 在介绍数据库的初始化之前我们需要先了解领域类和数据库之间映射的一些约定.在CodeFirst模式中,约定指的是根据领域类(如Student,Grade类)自动配置概念模型的一些默认规则.在上一节的小栗子中,我们没有在领域类中做任何配置,但是EF API帮我们配置了主外键.关系.列的数据类型等,这就是约定在起作用.下表中列除了一些默认的CodeFirst约定: 默认规则 描述 Schema EF创建所有的DB对象都放在dbo架构…
前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的领域类,然后根据默认的规矩来配置概念模型.Code-First约定定义在这个命名空间下面: System.Data.Entity.ModelConfiguration.Conventions 现在来大致浏览一下都有哪些约定吧: 类型发现 在前面的章节中,我们在上下文类中创建了DbSet属性的类集合,…
1.什么是CodeFirst 从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD).在CodeFirst模式中,我们不再先创建数据库,然后在程序中创建对应的类:CodeFirst开发模式中我们只关注应用程序的域(Domain)直接开始创建类,EF会根据我们创建的类自动生成数据库. CodeFirst的工作流程如下所示: 使用CodeFirst模式进行开发时,我们的开发流程是:创建/修改领域类--…
我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系(如student has a name,student is a person--继承),然而数据库中只有“has a”关系.数据库管理系统并不支持继承,所以我们怎么去映射具有继承关系的领域类呢? EF CodeFirst中有三种方式表示继承体系: 1.TPH(table per hierarch…
1.添加初始化数据(Seed) 我们可以在初始化数据库的过程中给数据库添加一些数据.为了实现初始化数据(seed data)我们必须创建一个自定义的数据库初始化器(DB initializer),并重写其中的Seed方法. 下边的栗子展示在School数据库中给Standard表添加默认的数据: 第一步:创建自定义初始化器 //继承三种内置的初始化器中的DropCreateDatabaseAlways public class SchoolDBInitializer : DropCreateDa…