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语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
随机推荐
- Vim配置(转)
1.按F5可以直接编译并执行C.C++.java代码以及执行shell脚本,按“F8”可进行C.C++代码的调试 2.自动插入文件头 ,新建C.C++源文件时自动插入表头:包括文件名.作者.联系方式. ...
- Scrapy爬取美女图片第三集 代理ip(上) (原创)
首先说一声,让大家久等了.本来打算那天进行更新的,可是一细想,也只有我这样的单身狗还在做科研,大家可能没心思看更新的文章,所以就拖到了今天.不过忙了521,522这一天半,我把数据库也添加进来了,修复 ...
- Pywinauto 基于Win32 程序的自动化功能测试工具
1. 前提条件 ü Python2.6 下载地址:http://ishare.iask.sina.com.cn/f/8173206.html ü Pywinauto-0.4.1 下载地址:htt ...
- Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题
//php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_av ...
- 安卓读写INI文件
安卓读写INI文件 uses System.IoUtils procedure TForm1.Button1Click(Sender: TObject);var IniFile:TIniFile; C ...
- GitLab使用自定义端口
Git支持两种地址访问方式,一种是:使用ssh协议,另一种是:使用http协议. 今天在部署Git服务器拉取和上传代码是出现了以下问题ssh: connect to host gitlab.d ...
- Jersey Client传递中文参数
客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...
- [翻译]NUnit---TestCase Attributes(二十一)
TestCaseAttribute (NUnit 2.5) TestCase特性有两个效果,包括标记一个方法使用参数并且在调用的时候提供内置数据.示例如下,本示例会使用不同数据集执行3次: [Test ...
- Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三
爬虫与反爬虫的修罗场 哪种平台最吸引爬虫爱好者,当然是社区类的,那里容易产生原生态,高质量的数据啊, 你看微博,知乎,豆瓣爬的不亦乐乎. 评论也是产生内容的好地方 生活类点评网站 旅游类点评网站 音乐 ...
- docker 下载加速
执行这个命令: curl -SSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud. ...