什么是Code-First
Code-First主要用于领域驱动设计。在Code-First方法中,专注于应用程序的域,先开始为域实体创建类,而不是先设计数据库,然后创建与数据库设计相匹配的类。下图说明了代码优先方法
如上图所示,EFAPI将根据域类和配置创建数据库。这意味着需要先编写域类,然后EF将从代码创建数据库
Code-First工作流程
创建或修改域类 - >使用Fluent-API或数据注释属性配置这些域类 - >使用自动迁移或基于代码的迁移来创建或更新数据库
在实际开发中体验Code-First
Code-First是EF拥抱DDD开发,支持POCO(Plain Old CLR Object)类型的开发模式
项目结构
- EntityFramework.Entity:领域实体,开始使用Code-First需要重点关注的一层
- EntityFramework.Print:控制台程序,用于测试输出
NuGet安装EntityFramework
因为Code-First是DDD的开发模式,所以一开始不需要先设计数据库,应该先设计项目的域类,首先在Entity层安装EF
这里安装的EF版本是6.x
设计域实体
创建数据上下文
创建的上下文类派生自DbContext,调用DbContext的构造函数,这里其实是设置数据库连接参数,DbContext类存在多个构造函数重载;如果不传参数,它会自定将数据库的名字命名为类库名.类名;如果只传了name相当于指定数据库名称,如果格式是"name=xxx"属于ConnectionString,会去配置文件读取
配置文件如下:在配置文件中配置数据库连接字符串(需要注意: 在app.config文件的configuration的节点下(不要在第一个节点下,否则报错)
程序调用
到现在为止,我只是创建了域类,并且没有对域类进行任何的配置(这里指使用EF中的注解DataAnnotation或者Fluent API),也没有创建数据库、表。现在使用看看
看下数据库
发现自动创建了数据库、表、字段、并且数据也成功写入了
这里引出一个概念:Conventions are sets of default rules which automatically configure a conceptual model based on your domain classes when working with the Code-First approach.
释义:约定是一组默认规则,在使用Code-First方法时会根据您的域类自动配置概念模型
Code-First约定在System.Data.Entity.ModelConfiguration.Conventions命名空间中定义
默认约定 | 描述 |
---|---|
架构 | 默认情况下,EF将所有数据库对象创建到dbo模式中 |
表名称 | EntityClassName +'s' |
主键名称 | EF将为名为Id或<实体类名> +“Id”(不区分大小写)的属性创建主键列 |
外键属性名称 | 默认情况下,EF将查找与主体实体主键名称相同名称的外键属性如果外键属性不存在,那么EF将在Db表中使用<依赖导航属性名称> +“_”+ <主体实体主键属性名称>创建一个FK列 |
空列 | EF为所有引用类型属性和可为空的基本属性创建一个空列,例如字符串,Nullable ,Student,Grade(所有类类型属性) |
不是空列 | EF为主键属性和非空值类型属性(例如int,float,decimal,datetime等)创建NotNull列 |
数据库列顺序 | EF将按照与实体类中的属性相同的顺序创建数据库列。但是,主键列会先移动 |
映射到数据库的属性 | 默认情况下,所有属性都将映射到数据库。使用该[NotMapped]属性从数据库映射中排除属性或类。 |
级联删除 | 默认情况下为所有类型的关系启用 |
SQL Server数据类型映射的C#数据类型
C# Data Type | Mapping to SQL Server Data Type |
---|---|
int | int |
string | nvarchar(Max) |
decimal | decimal(18,2) |
float | real |
byte[] | varbinary(Max) |
datetime | datetime |
bool | bit |
byte | tinyint |
short | smallint |
long | bigint |
double | float |
char | No mapping |
sbyte | No mapping(throws exception) |
object | No mapping |
总结:Code-First是领域驱动设计模式(DDD)一种体现,抛弃传统的从数据库设计开始,将关注点放在域模型上,根据域模型来创建数据库;针对域模型,EF提供默认的约定、DataAnnotation、Fluent API来对域模型进行配置。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">