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 的设计器的工具以及其他可能的软件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

全文来了!打败DBA老炮,机器学习如何改变数据库管理系统

作者 | Dana Van Aken、Andy Pavlo、Geoff Gordon 编译 | AI100 数据库管理系统(DBMSs)是所有数据密集型应用的...

37012
来自专栏后端云

compute node ha 主流开源实现

nova evacuate和热迁移很像。都是想实例从一个节点转移到另外一个节点。区别主要是热迁移在正常状态下进行的,疏散时在异常状态下进行的。用一个形象的比如就...

1703
来自专栏PaddlePaddle

【FAQ】集群训练与预测相关问题汇总

导语 在使用指南的最后一部分,我们汇总了使用PaddlePaddle过程中的常见问题,本部分推文目录如下: 2.22:【FAQ】模型配置相关问题汇总 2.23:...

3547
来自专栏机器学习算法原理与实践

日志和告警数据挖掘经验谈

    最近参与了了一个日志和告警的数据挖掘项目,里面用到的一些思路在这里和大家做一个分享。

852
来自专栏AILearning

TensorFlow架构

我们设计了TensorFlow进行大规模的分布式训练和推理,但它也足够灵活,以支持新机器学习模型和系统级优化的实验。 本文档描述了使得这种组合规模和灵活性成...

4057
来自专栏前端笔记

【新手指南】浅谈几种WordPress固定链接的优劣势

新手建站须知: 所谓“固定链接”,其实就是指访问某个网页的特定链接。也是我们站长将网站提交给各大站长平台的重要参数之一!建站初期我们必须确定好“固定链接”(准确...

3197
来自专栏开源优测

JMeter定时器06

前言 在默认情况下,jmeter发送每个请求之间是没有延时的,如果采用默认方式,如果线程数足够大,瞬间就会将服务器压死。再则在实际的业务过程中,请求之间是有一定...

3946
来自专栏Spark学习技巧

几种简单的负载均衡算法

什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务...

4795
来自专栏铭毅天下

吃透 | Elasticsearch filter和query的不同

除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度的_score。

1472
来自专栏WeTest质量开放平台团队的专栏

深度了解Android 7.0 ,你准备好了吗?

8月22日,谷歌正式推送Android 7.0 Nougat(牛轧糖)正式版,首发推送了多款Nexus设备。除了修复常规BUG,Android 7.0还新增了分...

8661

扫码关注云+社区

领取腾讯云代金券