前言

EF框架具有有三种数据持久化的方式,分别为Code First,Model First,Database First.看一下它们都有什么联系?

叙述

EF框架的三种工作方式

1.Database First是基于已存在的数据库,利用某些工具(如VS提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。也就是从一个数据库开始,然后生成实体框架和相应代码。
  2.Model First 是先利用某些工具(如VS的EF设计器)设计出可视化的实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件。
  3.Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型。

(1)Code First

Code-First主要用于领域驱动设计。使用Code-First方法,您可以专注于域设计,并根据您的域要求开始创建类,而不是先设计数据库,然后创建与您的数据库设计相匹配的类。Code-First API将根据您的实体类和配置实时创建数据库。
基本的工作流程将是:
   编写应用程序域类和上下文类→配置域类以获取其他映射需求→按F5运行应用程序→Code First API创建新数据库或使用域类映射现有数据库→将种子默认/测试数据插入数据库→最后启动应用程序

举个例子

假设我们要为XYZ学校创建一个简单的应用程序。此学校申请的用户应该能够添加或更新学生,标准(成绩),教师和课程信息。

首先,我们不必先设计数据库表,而是根据需要为学校域创建类。首先,我们将创建两个简单的学生和标准课程,每个学生都与一个标准相关联,如下所示。

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

标准(年级)班级应该能够容纳多个学生,如下所示。

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

现在,我们已经完成了我们学校应用程序的初始域类。Code First的方法也需要上下文类,它应该从DbContext派生。
  创建一个如下所示的上下文类,该类从DBContext类派生,并为要成为模型的一部分的类型公开DbSet属性,例如Student和Standard类。DbSet是实体类(又名实体集)的集合,所以我们赋予了实体名称的复数形式,如学生和标准。

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

现在,我们已经完成了Code Model方法所需的类。现在我们将使用上下文类添加学生,如下所示。

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 API的美妙之处。它会根据你的上下文类的基础构造函数中传递的参数创建数据库。由于我们的上下文类的构造函数中没有传入任何参数,因此在本地SQLEXPRESS数据库中创建了“EF_Code_First_Tutorials.SchoolContext”数据库,如下所示。它还在此数据库中创建了两个表,学生和标准表基于上面定义的Student和Standard域类。

如上图所示,它创建了Students和Standards表,每个表包含具有适当数据类型和长度的列。列名和数据类型与各个域类的属性相匹配。它还将StudentId和StandardId作为PK(主键)和Standard_StandardId列作为FK(外键)。
  这样,如果不先创建数据库,则可以开始编写一个应用程序,最终将从您的域类创建数据库。

(2)Model First

在Model First方法中,你可以直接在EDMX的设计界面上创建实体,关系和继承层次结构,然后从你的模型生成数据库。

举个例子:

Entity Framework之Model First生成模式

(3)Database First

我们从现有的数据库中创建了EDM,上下文和实体类。所以,当你从现有的数据库生成EDMX时,它是一个数据库优先的方法。

举个例子:

Entity Framework之Database First生成模式

如何选择

我们已经了解了代码优先,模型优先和数据库优先的方法。所以,在我们的应用程序中使用哪种开发方法。下图说明了决策树

如果您已经有一个现有的具有域类的应用程序,那么您可以使用代码优先的方法,因为您可以使用此方法从现有类创建数据库。如果您有现有数据库,则可以使用数据库优先方法从现有数据库创建EDM。如果您没有现有的数据库或域类,并且您更愿意在可视化设计器上设计数据库模型,那么请选择“模型优先”方法。

小结

本文简单的分析了一些EF框架的三种工作方式,实现数据的快速访问。其中Database First是EF最早支持也是最容易上手的一种开发模式,可以复用数据库;Model First是最能体现面向对象思想的一种模式,而且也很容易;Code First 即是编写代码,这种模式适合于资深的程序员,而且只需要编写代码实体类自动生成方便快速,更易维护,但是对于手动创建,对于太多的实体的时候则不方便,工作较多。所以我们在选择使用EF的三种模式时,根据我们自己的实际需求,选择最适合自己的,对自己的工作效率最有益的。

【EF框架】EF框架的开发方法相关推荐

  1. 简单了解实体框架EF(Entity Framework)

    1)什么是EF框架 全称EntityFramework 官方点的解释是Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架. 什么是O ...

  2. ORM 框架--EF详解

    文章目录 EF ORM EF的三种创建方法 实体配置 配置 DataAnnotations FluentAPI 基本增删改查 增加 删除. 修改 查 原理及SQL监控 执行原生SQL. 不是所有lam ...

  3. 微软ORM框架EF初探

    微软ORM框架EF初探 一.ORM 顾名思义,ORM(ObjectRelational Mapping)对象关系映射,广义上是指面对对象的对象模型和关系型数据库的数据结构之间的相互装换.通俗来讲,就是 ...

  4. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  5. 初学实体框架EF(Entity Framework)

    什么是EF? 实体框架EF是微软的一个ORM框架.是支持面向数据的软件开发应用程序. ORM是面向对象的对象模型和关系型数据库的数据结构之间的相互转换.EF是ORM框架的一种,其中O代表实体,M代表的 ...

  6. ueditor集成实例php,Laravel框架集成UEditor编辑器的方法图文与实例详解

    本文实例讲述了Laravel框架集成UEditor编辑器的方法.分享给大家供大家参考,具体如下: 一. 背景 在项目开发的过程中,免不了使用修改功能,而富文本编辑器是极为方便的一种推荐,当然,个人认为 ...

  7. 框架应用 : Spring MVC - 开发详述

    软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...

  8. golang微服务框架对比_Go语言开发的微服务框架,你了解多少?

    Go语言开发的微服务框架 1.项目名称:Istio 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证.监控 ...

  9. 谷歌浏览器iframe兼容问题_兼容解决 IE 、火狐、谷歌浏览器中 Iframe框架的页面缓存的方法...

    在我们的项目中往往少不了广告的成分,有的时候我们为了方便修改一般会选择iframe嵌套进来的方法,开始的时候没怎么留意,一般自己换广告也是强制刷新,直到后来看广告统计的ip发现好多广告都下架了半个月了 ...

最新文章

  1. 08-Measured Boot Driver (MBD)
  2. MAX3232和MAX232的具体差别
  3. AJAX——基于请求加载数据
  4. tomcat闪退没有报错_Appium在Android平台几种常见报错的解决方案
  5. mysqldump单个库导出_初相识 | 全方位认识 sys 系统库
  6. GAN 优化 Yelp 形象图片广告
  7. 超简单将Centos的yum源更换为国内的阿里云源
  8. 第二部分 自动内存管理机制
  9. 大快DKH大数据网络爬虫安装教程(详细图文步骤)
  10. Linux 驱动层实现阻塞和非阻塞
  11. macOS 开发 - Command Line Tool 命令行工具
  12. 解决dephi使用Word时出现“没有注册接口”的情况。
  13. 步步惊心插曲 - 歌词
  14. Tikhonov regularization 吉洪诺夫 正则化
  15. 如何用PHP判断一个网址是否被百度搜索引擎收录,判断的原理是什么?
  16. 鸿蒙窍做何解释,终朝睡在鸿蒙窍 一任时人牛马呼
  17. python entry如何清空_Python tkinter,从类中清除Entry小部件
  18. 如何解决hbase中数据热点问题
  19. latex中输入数学中的“属于” 符号
  20. ICCV 2019 | 中国研究者无缘最佳论文奖项,接收论文数量超美国,商汤57篇论文入选...

热门文章

  1. 【Linux操作系统】——Linux命令
  2. 2022不一样的分享--行走的皮卡丘
  3. 量化交易入门阶段:好事要成双——双均线策略
  4. C1083: 无法打开包括文件: plugin.moc: No such file or directory
  5. SDN:简述对SDN架构的认识
  6. IP-Prefix List
  7. 微信链接修改图片_微信链接修改图标
  8. 完爆90%的数据库性能毛病!
  9. 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?
  10. Mybatis的collection和association