EF基础知识小记二
1、EF的常用使用场景
(1)、维护一个已经存在的数据库,VS提供了工具帮助我们把数据库中的表和视图等对象导入到实体框架. [数据库=>模型(Database First)]
(2)、通过VS提供的实体设计器设计表模型,然后从头开始添加实体类型、类型间的关联以及继承体系到设计器中.模型创建好后,然后根据模型生成数据库. [模型=>数据库(Model First)]
(3)、EF还提供了以代码为中心的模型设计方式,通过这种方式我们可以在不使用设计器的情况下,手工创建一系列的领域类、领域类之间的关联以及上下文对象(一般继承自DbContext),然后把这些类和实体框架引擎关联起来.这种开发模式叫Code First,是Model First和Database First的结合体,支持双向生成.另外,实体开发框架团队还为我们提供了一个"代码优先迁移"工具,他能让数据库保持你模型中最新的修改.
2、EF的工作方式
EF有三种工作方式,一种是Database First,第二种是Model First,第三种是Code First,Database First和Model First均使用EF设计器提供的可视化方案来表示存储在基于xml格式的.edmx中模型(直白点,通过设计器生成的基于xml格式的模型).Database First 从一个已存在的数据库逆向生成一个模型,Model First从EF设计器中创建的模型生成数据库。
Code First是一种可以替代edmx(EF模型设计器)的方案。从概念上讲,Code First同时支持Database First和Model First两种工作方式.
Model First:EF 会在 EDMX 后从 XML 中创建内存中模型
Code First:EF 会通过读取类(即您提供的 DbContext 和映射)来创建相同的内存中模型
3、关于EF7只支持代码建模方式的原因
(1)、源代码控制合并、冲突、代码审查变得困难
当把整个模型存储在xml文件中时,模型上的一个小的改动,将导致xml中产生较大的差异,与此同时,开发人员得合并和重新审查源代码.
(2)、设计器xml语法的复杂性
在一些简单的项目中,模型设计器可能带来很大的便利,但是很多项目的需求超出了设计器的能力范围,需要xml里面的代码,但是这比修改代码难的多.
(3)、基于代码的模型灵活性高
很多时候程序运行时你需要指定架构或是表前缀的多租户数据库(Multi-tenant database)。也在可能会根据不同的数据库提供商在运行时轻微调整你的模型。实现这些需求,使用操作基于xml文件的模型会异常艰难。另一方面,在代码中使用条件逻辑来定义模型会很容易实现 。
(4)、基于代码的模型不会生成额外的东西
假设一个Customer实体拥有一个CustomerId属性,在基于EDMX的模型中,会生成对应的一个名为Customer的CLR类型里面会有一个CustomerId属性,除此之外,还会有一个xml版本的BlogId属性(外加列和映射)以及另外的一些xml内容来标识BlogId作为一个实体键。但是基于代码的模型中,我们只需要通过代码(具体方式请参考EF CodeFirst 约束配置)来构建模型即可,不会生成额外的文件.
(5)、在代码中提供有用的错误信息更加的容易
基于EDMX模型报告很难读懂。但是在基于代码的模型中抛出一个配置错误的异常会很容易。在EF6.x版本,经常会从代码优先管道(Code-First pipeline)中得不到有用的错误信息,这是因为它是建立在为EDMX模型设计的基础设施上。在EF7中,将不会存在这样的情况了。
4、关于EF7的数据库迁移功能
数据库迁移:它允许你从基于代码的模型创建数据库,并随着模型的改变而演进,对于EDMX模型你可以生成一个与当前模型匹配的创建数据库的SQL脚本,但是没有办法生成一个包含模型变化的脚本,并将模型变化应用到已存在的数据库中去(直白点说就是,如果你修改了EDMX模型,并将模型映射到数据库,那么EF会重新帮你生成整个数据库,而不是将修改部门映射到数据库)。
5、EF7的开发方式
EF7开始只支持Code First,所有的模型均通过代码生成.可以通过MS提供的工具从一个数据库逆向生成一个模型,当然也可以通过代码生成一个模型,在通过数据库迁移技术同步到数据库,这种同步是动态的,当模型发生改变数据库就会得到更新.
6、EF7 Code First存在的问题
(1)、EF摒弃了EDMX设计器,但是可视化绝对是有好处的,特别是当你有大量的相关联的类时.
(2)、"从数据库更新模型"的场景,Code First 你可以通过重新运行逆向工程进程,重新生成你的模型,在一些基本的场景中,这种方法表现得很好。但是你关心的是,新生成的代码会覆盖你在模型中自定义部分
7、关于放弃EDMX的问题
F7 将不支持基于设计器的 EDMX 模型。它无法在运行时读取 EDMX XML 来创建内存中模型。它将只使用代码优先工作流。但是虽然放弃了EMDX,但是可以将数据库反向工程到POCO 类、DbContext 和映射,就是说我们可以通过工具如2011年发布的EF Power Tools Beta从现有数据库中提取基于Code First的模型。
8、使用第三方工具使EDMX模型拥有设计器的功能
支持EF 代码优先的 LLBLGen Pro Designer (bit.ly/11OLlN2) 以及 Devart Entity Developer (bit.ly/1yHWbB2)。查找可能提供支持 EF7 的设计器的工具以及其他可能的软件。
EF基础知识小记二的更多相关文章
- EF基础知识小记四(数据库=>模型设计器)
EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...
- EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...
- EF基础知识小记五(一对多、多对多处理)
本文主要讲EF一对多关系和多对多关系的建立 一.模型设计器 1.一对多关系 右键设计器新增关联 导航属性和外键属性可修改 2.多对多关系 右键设计器新增关联 模型设计完毕之后,根据右键设计器根据模型生 ...
- EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)
日常开发中,经常会碰到一些自引用的实体,比如系统菜单.目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介 ...
- EF基础知识小记三(设计器=>数据库)
本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...
- EF基础知识小记一
1.EF等ORM解决方案出现的原因 因为软件开发中分析和解决问题的方法已经接近成熟,然后关系型数据库却没有,很多年来,数据依然是保存在表行列这样的模式里,所以,在面相对象和高度标准化的数据库中产生了一 ...
- Linq基础知识小记二
书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1.方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1).链式查询 这种查询方式很多语 ...
- Linq基础知识小记四之操作EF
1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
随机推荐
- python 修改文件编码方式
import chardet import os def strJudgeCode(str): return chardet.detect(str) def readFile(path): try: ...
- Spring bean是如何加载的
Spring bean是如何加载的 加载bean的主要逻辑 在AbstractBeanFactory中doGetBean对加载bean的不同情况进行拆分处理,并做了部分准备工作 具体如下 获取原始be ...
- Linux中的LVM和软RAID
在实际工作中,会经常碰到所给的服务器硬盘容量太小,而实际的应用软件中却需要一个容量较大的分区进行数据存储等,除了通过硬件RAID卡来实现合并多硬盘外,其实我们也可以通过软件的方式来实现. 实验 ...
- (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513
http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...
- OpenGL中位图的操作(glReadPixels,glDrawPixels等)
OpenGL中位图的操作 OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例). 1. BMP文件格式简单介绍 BMP文件是一种像素文件,它 ...
- Vivado级联Modelsim仿真Re-launch问题
前两天在群里看到有朋友说Vivado级联Modelsim仿真出现修改设计代码后重新run do文件,波形没有随着代码修改而改变,这个问题博主之前没有注意到,因为把Vivado和Modelsim级联好后 ...
- hdu 5033 模拟+单调优化
http://acm.hdu.edu.cn/showproblem.php?pid=5033 平面上有n个建筑,每个建筑由(xi,hi)表示,m组询问在某一个点能看到天空的视角范围大小. 维护一个凸包 ...
- [jquery-delegate] iphone_4s _iphone _5c_中不兼容jQuery delegate 事件(does not wok)
1. jQuery .on() and .delegate() doesn't work on iPad http://stackoverflow.com/questions/10165141/jqu ...
- C++回调:利用函数指针
#include <iostream> using namespace std; /**************************************************** ...
- SQL Server 索引基本概念与优化
数据页和区 页 SQL Server 中的数据以“页”(Page)的形式保存数据,页是SQL Server 的IO单位,读/写一次至少是一页.一页为8K(8192byte). 页由三部分组成,页头,数 ...