前言:学习了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 简易教程(一)的更多相关文章

  1. Entity Frame Code First 简易教程

    简介 什么是ORM 搭建Entity FrameWork CodeFirst应用 数据库迁移 表属性常见配置 Entity FrameWork 一对多.多对多 一.简介 Entity Framewor ...

  2. 文件上传利器SWFUpload入门简易教程

    凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...

  3. Ant 简易教程

    转载:http://www.cnblogs.com/jingmoxukong/p/4433945.html Ant 简易教程 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动 ...

  4. Intellj IDEA 简易教程

    Intellj IDEA 简易教程 目录 JDK 安装测试 IDEA 安装测试 调试 单元测试 重构 Git Android 其他 参考资料 Java开发IDE(Integrated Developm ...

  5. Android开发简易教程

    Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...

  6. Flow简易教程——安装篇

    .mydoc_h1{ margin: 0 0 1em; } .mydoc_h1_a{ color: #2c3e50; text-decoration: none; font-size: 2em; } ...

  7. EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性

    ---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性 (2 ...

  8. EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理

    -----------------------------------------------------目录--------------------------------------------- ...

  9. EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手

    ----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程03-数据结构 ...

  10. [转]Unity3D Editor 编辑器简易教程

    Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star ...

随机推荐

  1. HTTP笔记(二)

    HTTP首部 不管是请求报文还是响应报文,都会包含首部信息.HTTP首部都是由字段名和字段值构成的,中间由英文冒号:隔开.一个首部字段名可以对应多个字段值. 四种首部字段的类型: 通用首部字段:请求报 ...

  2. es-07-head插件-ik分词器插件

    5.x以后, es对head插件的支持并不是特别好 而且kibana的功能越来越强大, 建议使用kibana 1, head插件安装 在一台机器上安装head插件就可以了 1), 更新,安装依赖 su ...

  3. SQL 语句语法简介(一)

    语句分类 SQL 命令一般分为三类:DQL.DML.DDL. 一.DDL语句. 1.1建表语句 CREATE TABLE table_name( col01_name data_type, col02 ...

  4. SSH-公私钥认证

    Linux下SSH的认证方式有两种,即密码认证和公私钥认证. 我们在日常的安全维护中,出于安全的考虑,密码不明文存放,会使用公私钥认证方式.这个时候我们就需要使用ssh-keygen,ssh-keyg ...

  5. CAS多点登录

    转自:http://www.blogjava.net/alwayscy/archive/2012/12/01/392322.html 场景 想要用到的场景:用户访问WEB服务,WEB访问非WEB服务1 ...

  6. Docker基础教程(安装篇)

    Linux安装: 1.yum -y install docker-io 2.service docker start 3.chkconfig docker on Window安装: Docker 引擎 ...

  7. Android系统版本、Platform版本、SDK版本、gradle修改

    虽然之前分析了gradle,但是在eclipse导入Android studio的时候,各个版本出现的问题还是很模糊,下面对各种版本进行一下说明: 参考资料: https://developer.an ...

  8. SQL SERVER 快捷键收录

    1.大小写转换快捷键 Ctrl+Shift+U 转为大写 Ctrl+Shift+L 转为小写  

  9. Go语言封装Http协议GET和POST请求

    本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...

  10. SQL查询中的转义字符

    转载自http://blog.csdn.net/Adi_liu/archive/2007/12/06/1920606.aspx   如果想查找“_cs”结尾的的账户 select * from [us ...