EntityFramework Code-First教程(一)
前言:学习了EF框架这么久,还没有好好总结一番,正好遇到一国外的网站,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢多谢。好了,进入正题
EF框架有三种设计模式:Code-First、Model-First、Database-First,本篇讨论Code-First
(EF6已开源,网址:http://entityframework.codeplex.com/)
什么是Code-First?
Entity Framework 从EF4.1开始包含Code-First模式,Code-First主要用在Domain Driven Design(领域驱动设计)中。在Code-First模式中,我们针对每一个功能要求创建一个模型类(Domain Class),把关注点放在一个领域里,Code-Fiist 将会根据我们的模型类和配置自动创建数据库。

当我们程序运行的时候,Code-First会创建一个新的数据库(如果不存在),并根据默认约束把模型类映射到数据库表里,一个类对应一张表,我们可以使用DataAnnotation或者fluent API配置模型类来重写默认约定。先别急,后面会一一介绍。
所以Code-First设计的工作流程应该是:
编写模型类和context类→配置映射要求→运行程序→创建新的数据库或者用模型类映射已存在的数据库→录入测试数据→发布最终应用程序
环境配置
开发环境及工具:
- .NET Framework 4.5
- Visual Studio 2013
- MS SQL Server 2008/2012 Express
用Nuget安装EF,在解决方案上右键,选中NuGet

搜索EntityFramework

点击安装

安装完成后,在我们项目引用里面就有了EntityFramework的程序集,我们点右键属性,发现版本是6.0

这样,EF环境就搭好了。
一个简单的示例
假定我们为某学校创建一个应用程序,那么这个程序应该能够添加或修改学生信息、年级信息、教师信息和课程信息。
让我们先忘记数据库设计,我们先来为“学校”这个领域创建各种类,首先,我们创建两个简单的类,Student和Standard,这里,每个Student里面又包含了一个Standard类。

public class Student
{
public 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 Standard Standard { get; set; }
}

这个Standard(年级类)应该包含了多个Student,一个班上肯定有很多不同的学生,所以这是“one-to-many”(一对多)的关系。

public class Standard
{
public Standard()
{ }
public int StandardId { get; set; }
public string StandardName { get; set; } public ICollection<Student> Students { get; set; } }
}

模型类写好了,我们就要开始写DbContext,下面我们创建一个SchoolContext类,继承于DbContext,并且以我们刚刚创建的两个模型类为泛型,显示定义的两个DbSet<T>属性,属性名约定为复数形式(约定大于配置,在ASP.NET中这是很重要的一个设计理念)。注意,每一个模型类,都必须在DbContext中定义一个与之对应的DbSet<T>属性,代码如下:

namespace EF_Code_First_Tutorials
{ public class SchoolContext: DbContext
{
public SchoolContext(): base()
{ } public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; } }
}

现在,我们可以在主程序里实例化一个SchoolContext,然后添加学生信息了。

class Program
{
static void Main(string[] args)
{ using (var ctx = new SchoolContext())
{
Student stud = new Student() { StudentName = "New Student" }; ctx.Students.Add(stud);
ctx.SaveChanges();
}
}
}

如果我们运行程序,就会插入一条学生信息到数据库里。
到这里你肯定很奇怪,数据库在哪儿?表是什么样?表中各列又是什么样?别急,让我们打开数据库一探究竟。
这就是Code-First模式神奇的地方,它会自动帮我们创建数据库,并且以传入DbContext的构造函数中的参数来命名创建的数据库,因为上面实例化SchoolContext我们并没有传任何参数进去,所以它默认会以"项目名称.Context名"来命名数据库。如你所见,数据库里已经根据我们上面写的两个模型类创建了两张表,表的各个列就是类的各个属性。
注意:StudentId和StandardId自动设置为主键,Students表里自动创建了一个Standard_StandardId的外键,这是因为Student类里有一个Standerd类的属性,你肯定疑问怎样定义外键名,那下篇我们就来介绍Code-First约定。
EntityFramework Code-First教程(一)的更多相关文章
- Entityframework Code First 系列之数据注释
上一篇<Entityframework Code First 系列之项目搭建>讲了搭建一个Code First的控制台项目.里面有一些内容并没有扩展出来讲,因为篇幅有限.这篇针对上面内容中 ...
- C# EntityFramework Code First 迁移 降级 回退到空数据库
C# EntityFramework Code First 迁移 降级 回退到空数据库 1.包管理器控制台-迁移 在包管理器控制台中运行 Enable-Migrations Add-Migratio ...
- EntityFramework Code First便捷工具——数据迁移
使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...
- 【vscode高级玩家】Visual Studio Code❤️安装教程(最新版🎉教程小白也能看懂!)
目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过 ...
- EntityFramework Code-First 简易教程(二)-------Code First约定
Code First 约定 在前一篇中,我们已经知道了EF Code-First怎样从模型类(domain classes)中创建数据库表,下面,我们开始学习默认的Code-First约定. 什么是约 ...
- ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/ 谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...
- EntityFramework Code First 添加唯一键
在EntityFramework 6.1后可以直接使用 [Index("TitleIndex", IsUnique = true)] public string Title { g ...
- Entityframework Code First 系列之项目搭建
Entityframework(以下简称EF)是微软推出的一个ORM(Object Relational Mapping)框架. 优缺点 优点: 易上手,语法简单,查询容易 更新快,不断补足 缺点: ...
- 基于GitLab的Code Review教程
一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...
- C# EntityFramework Code First 迁移
如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数据库 生成迁移以跟踪对 EF ...
随机推荐
- 机器学习——XGBoost
基础概念 XGBoost(eXtreme Gradient Boosting)是GradientBoosting算法的一个优化的版本,针对传统GBDT算法做了很多细节改进,包括损失函数.正则化.切分点 ...
- 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...
- 微信小程序转百度小程序修改
百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...
- HDU 5596 ——GTW likes gt——————【想法题】
GTW likes gt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- bzoj 5298: [Cqoi2018]交错序列
Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对 ...
- springboot从入门到精通(二)
这一节我们一起用springboot开发一个应用程序,应用程序里的核心概念是玩家获取英雄列表上的英雄信息. 1.定义实体模型: 代码如下: package com.dota.herolist.enti ...
- textarea高度随着内容的多少而变化,高度可以删减
问题:可以多行输入,并且输入框的高度随着内容的多少而变化,输入框的高度不能只增不减 由于 input 只能单行输入 textarea可以多行输入,并且高度可以随着内容的增加而增加,但是当内容删减的时候 ...
- Web安全色的意义
问题: 不同的平台(Mac.PC等)有不同的调色板,不同的浏览器也有自己的调色板.这就意味着对于一幅图,显示在Mac上的Web浏览器中的图像,与它在PC上相同浏览器中显示的效果可能差别很大. 选择特定 ...
- SVNKit学习——svn二次开发背景和闲谈(一)
开发背景: 简述现有流程:代码的合并.提交是以任务为最小单元的.例如A和B两个同学开发不同的任务,那就是两个任务号.合并的时候可能会先合并A的代码,在合并B的代码. 需求:SVN合并程序开发——一款能 ...
- Matlab函数——awgn(高斯噪声)
Matlab函数--awgn awgn 将白色高斯噪声添加到信号中 语法 y = awgn(x,snr) y = awgn(x,snr,sigpower) y = awgn(x,snr,'mea ...