前言:学习了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. logstash-2-插件配置

    配置语法:  Logstash必须有一个 input 和一个 output 1, 处理输入的input 1), 从文件录入 logstash使用一个名为 filewatch的 ruby gem库来监听 ...

  2. php还原16进制特殊字符

    特殊字符的16进制表:https://websitebuilders.com/tools/html-codes/ascii/ 可以通过 hexdec() 和 chr()方法来进行转换, 例子: < ...

  3. springMVC和json整合配置方法

    一.配置方法一 1.导入第三方的jackson包,jackson-mapper-asl-1.9.13.jar和jackson-core-asl-1.9.13.jar 百度云链接:https://pan ...

  4. 基于多层感知机的手写数字识别(Tensorflow实现)

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  5. vue-cli中配置屏幕自适应(px2rem)

    在vue-cli中配置屏幕自适应的方法 首先,我们需要安装flexible库. npm i lib-flexible --save 在index.html文件当中配置meta标签, <meta ...

  6. Spring基础(3) : 静态工厂和实例工厂创建bean

    public class Factory { public static Person staticCreate(){ Person p = new Person(); p.name="st ...

  7. Oracle左连接、右连接、全外连接以及(+)号用法

    1.准备工作 Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...

  8. c#关于路径的总结(转)

    来源:http://www.cnblogs.com/yugongmengjiutian/articles/5521165.html 前一段时间写代码时经常遇到获取路径问题,总是感觉有点乱,于是就总结了 ...

  9. protocol buffer c#

    第一.打开vs中的Nuget

  10. HDU1281(KB10-D 二分图最大匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...