前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EF基础知识小记二

EF基础知识小记二

作者头像
郑小超.
发布2018-01-26 16:23:20
1.1K0
发布2018-01-26 16:23:20
举报
文章被收录于专栏:GreenLeavesGreenLeaves

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据传输服务
腾讯云数据传输服务(Data Transfer Service,DTS)可帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库多活架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。同时,DTS 还提供私有化独立输出版本 DTS-DBbridge,支持异构数据库和同构数据库之间迁移和同步,可以帮助企业实现完整数据库迁移(如 Oracle)。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档