EF CodeFirst系列(1)---CodeFirst简单入门
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.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),在以后的章节会介绍。
EF CodeFirst系列(1)---CodeFirst简单入门的更多相关文章
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- 系列文章--oracle简单入门教程
oracle入门很简单:八.oracle数据表 1.创建oracle数据表创建oracle数据表的语法如下: create table命令用于创建一个oracle数据表:括号内列出了数据表应当包含的列 ...
- 【java开发系列】—— struts2简单入门示例
前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了js ...
- 2.简单的Code First例子(EF Code-First系列)
现在假想,我们想要为讴歌学校创建一个应用程序,这个程序需要能够来添加或者更新学生,分数,教师还有课程信息. 代替之前我们的做法:先是创建数据库,现在我们不这么做,我们先来创建领域类,首先我来创建两个简 ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- 3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx EF 6 Code-Firs ...
- 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...
- 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)
原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...
- 21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/entity-framework-power-tools.aspx 大家好,这里就是EF ...
随机推荐
- Redhat安装Oracle 11g (转)
1.1 安装前准备 1.1.1 修改操作系统核心参数 在Root用户下执行以下步骤: 1.1.1.1 修改/etc/security/limits.conf文件 输入命令:vi /et ...
- LeetCode算法题-Poor Pigs(Java实现)
这是悦乐书的第235次更新,第248篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第102题(顺位题号是455).有1000个水桶,其中只有一个水桶含有毒药,其余的都没毒 ...
- Nginx 配置 https
从云服务提供商处申请证书 申请 https 证书教程-百度经验 申请下来的证书目录结构 . ├── Apache │ ├── 1_root_bundle.crt │ ├── 2_website ...
- 英语口语练习系列-C18-Wildest Dreams
词汇复习 actor 演员 afternoon 下午 alive 活着的 apple 苹果 adjective 形容词 air 空气 animal 动物 April 四月 adult 成年人 airp ...
- Benchmarking Apache Kafka: 2 Million Writes Per Second (On Three Cheap Machines)
I wrote a blog post about how LinkedIn uses Apache Kafka as a central publish-subscribe log for inte ...
- spring上下文和springMVC上下文的关系
查看原文
- web框架开发-分页器(Paginator)
Django有自带的分页器,可以将数据分在不同的页面中,并提供一些属性和方法实现对分页数据的操作.分页功能的类位于django/core/paginator.py中. 常用方法 # 分页器 # pag ...
- 001_JavaScript数组常用方法总结及使用案例
一. https://msdn.microsoft.com/zh-cn/library/ff679976(v=vs.94).aspx 二.ip地址转换成对应的二进制. const ip='172.16 ...
- docker pull报错failed to register layer: Error processing tar file(exit status 1): open permission denied
近来在一个云主机上操作docker pull,报错如下: failed to register layer: Error processing ): open /etc/init.d/hwclock. ...
- Pandas基本操作
pandas:数据分析 pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. pandas的主要功能 具备对其功能的数据结构DataFrame.Series 集 ...