1.什么是CodeFirst

  从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD)。在CodeFirst模式中,我们不再先创建数据库,然后在程序中创建对应的类;CodeFirst开发模式中我们只关注应用程序的域(Domain)直接开始创建类,EF会根据我们创建的类自动生成数据库。

CodeFirst的工作流程如下所示:

使用CodeFirst模式进行开发时,我们的开发流程是:创建/修改领域类-->配置领域类(使用Fluent API或者注释属性)-->新建/修改数据库架构(使用自动迁移或者代码迁移)

2.CodeFirst的简单入门案例

添加一个名字为EF6Console的控制台应用程序,然后把EF引入到项目中,如下图:

添加了EF后我们就可以就行EF的CoreFirst开发了

第一步:添加领域类

首先添加两个Student和Grade类(学生和年纪),它们是一对多关系,一个年级有多个学生,而一个学生只能有一个年级,代码如下:

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; }
}

第二步:添加context上下文

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简单入门就结束了,是不是特别方便?

我们在程序中添加一个Student,代码如下:

    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("初始化完成");
}
}
}

执行后数据库就自动创建了,如下图所示

  因为没有添加任何关于context的设置,所以EF安装默认规则在vs内置的sqlserver中给我们创建了 数据库,名字是EF6Console.SchoolContext(项目名.上下文名),同时给Student和Grade领域类生成了dbo.Studentsdbo.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),在以后的章节会介绍。

EF CodeFirst系列(1)---CodeFirst简单入门的更多相关文章

  1. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  2. 系列文章--oracle简单入门教程

    oracle入门很简单:八.oracle数据表 1.创建oracle数据表创建oracle数据表的语法如下: create table命令用于创建一个oracle数据表:括号内列出了数据表应当包含的列 ...

  3. 【java开发系列】—— struts2简单入门示例

    前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了js ...

  4. 2.简单的Code First例子(EF Code-First系列)

    现在假想,我们想要为讴歌学校创建一个应用程序,这个程序需要能够来添加或者更新学生,分数,教师还有课程信息. 代替之前我们的做法:先是创建数据库,现在我们不这么做,我们先来创建领域类,首先我来创建两个简 ...

  5. 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...

  6. 3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx EF 6 Code-Firs ...

  7. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  8. 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...

  9. 21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/entity-framework-power-tools.aspx 大家好,这里就是EF ...

随机推荐

  1. 安装和使用git遇到的问题总结

    一,centos7下安装(因为centos7下用yum安装git的版本太低了,所以只能下载源代码,然后用源代码安装) 下载编译工具 yum -y groupinstall "Developm ...

  2. 【转载】IIC SPI UART串行总线

    一.SPISPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用. 接口SPI接口经常被称为4线串行 ...

  3. MFC拖拽、选择目录、遍历文件

    1.选择目录 void CDecryptFileDlg::OnBnClickedSel() { std::wstring selectedDir; WCHAR szDir[MAX_PATH]; Zer ...

  4. python3 shell 中添加清屏

    在windows中: 安装目录 \Lib(  D:\Python37\Lib) 中添加 ClearWindow.py 文件,文件内容: """ Clear Window ...

  5. 英语口语练习系列-C05-水电

    <登幽州台歌>·陈子昂 陈子昂(公元659-公元700年),唐代文学家,初唐诗文革新人物之一. Num 诗句 1 前不见古人, 2 后不见来者. 3 念天地之悠悠, 4 独怆然而涕下! T ...

  6. 阿里巴巴JAVA开发手册

    Java编程规约 (一)命名风格      1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.           反例: _name / __name / $O ...

  7. Python操作MySQL:pymysql模块

    连接MySQL有两个模块:mysqldb和pymysql,第一个在Python3.x上不能用,所以我们学pymysql import pymysql # 创建连接 conn = pymysql.con ...

  8. Linux 进入 5.0 时代!

    Linux 进入 5.0 时代! 为什么 Linux 4.2 之后的版本不再是 4.21 而是 5.0? 如果你非要一个理由,那就是因为 Linux 4.x 的版本如今用手指与脚趾加在一起都要数不过来 ...

  9. mmap:速度快+整块操作

    mmap使得可以将设备内存映射到用户空间,从而使得用户程序获得访问硬件的能力,mmap的动作需要由内核中的驱动来实现.在使用mmap映射后,用户程序对给定范围的内存的读写就变成了对设备内存的读写,也就 ...

  10. Python--day03(变量、数据类型、运算符)

    day02主要内容回顾 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识 ...