什么是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;">

 
 
 
 

EF-CodeFirst-基础的更多相关文章

  1. EF CodeFirst 基础命令

    PM> enable-migrations 已在项目"EasyWeChat.Data"中启用迁移.若要覆盖现有迁移配置,请使用 -Force 参数. PM> add-m ...

  2. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

    本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...

  3. EF Codefirst 中间表(关系表)的增删改查(转)

    EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)   前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订 ...

  4. 新年奉献MVC+EF(CODEFIRST)+EASYUI医药MIS系统(转)

    出处:http://www.cnblogs.com/chenlinzhi/p/4332628.html 本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新 ...

  5. EF CODEFIRST WITH ORACLE 存储过程

    EF  CODEFIRST WITH ORACLE 解决存储过程一直没找到解决方案 所以最后也没办法还是用了最基本的解决方案 采用Oracle.ManagedDataAccess提供的ADO基础访问类 ...

  6. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  7. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  8. [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations

    本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...

  9. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  10. EF CodeFirst增删改查之‘CRUD’

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...

随机推荐

  1. django DateTimeField 时间格式化

    ['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d', # ' ...

  2. 【iCore4 双核心板_ARM】例程六:IWDG看门狗实验——复位ARM

    实验原理: STM32内部包含独立看门狗,通过看门狗可以监控程序远行,程序运行错误时, 未在规定时间内喂狗,自动复位ARM.本实验通过按键按下,停止喂狗,制造程序运行 错误,从而产生复位. 核心代码: ...

  3. Spring MVC学习摘要

    1. context:component-scan标签的use-default-filters属性的作用以及原理分析 http://www.cnblogs.com/hafiz/p/5875770.ht ...

  4. 【转】Spring Framework灰度发布

    今天简单介绍下SpringFramework微服务中几种服务发布策略以及实现方式.我接触过的有蓝绿.滚筒和灰度发布. 蓝绿发布: 简单说就像美帝选总统投票一样,非蓝即绿一刀切,这个其实也是传统软件架构 ...

  5. mininet下建立拓扑时关于远程控制器的一个小问题

    最近重装了系统和mininet后,使用mininet时遇到了一点小问题,一开始忽视了细节,使得自己被这个问题困扰了好一会儿,好在后来还是发现了问题所在,故记录下来. $ sudo mn --topo ...

  6. Java面向对象的基本概念(对象、封装、继承、多态、抽象、接口、泛型)

    对象:是一个自包含的实体,用一组可识别的特征和行为来标识. 类:具有相同的属性和功能的对象的抽象合集.(类关键字class,首字母大写). 实例:就是一个真实的对象. 实例化:创建对象的过程,关键字是 ...

  7. Excel文档间的数据替换 ---电脑版APP 自动操作魔法师

    http://www.won-soft.com/macro/solution/excel-data-replace.htm 介绍: 在我们的日常工作中, 可能经常需要使用同各种数据表格打交道.比如财务 ...

  8. 【转帖】oracle数据类型和对应的java类型

    原文地址:http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.ht ...

  9. HTTP Status 500 - Could not open Hibernate Session for transaction;

    错误原因: mysql数据库没有连接上 我们来启动mysql 方法1: 管理员身份运行 cmd 输入:  net start mysql 方法2: Windows + R 运行 services.ms ...

  10. python通过input()函数输入的内容是什么类型

    说明: 通过input()函数,可以从标准输入读取内容,那么读到的内容是什么类型呢. 通过type()函数可以进行判断,另外,通过input()函数的官方解释,从标准输入读取一个字符串.所以,应该是字 ...