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基础知识小记二的更多相关文章

  1. EF基础知识小记四(数据库=>模型设计器)

    EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...

  2. EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)

    一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...

  3. EF基础知识小记五(一对多、多对多处理)

    本文主要讲EF一对多关系和多对多关系的建立 一.模型设计器 1.一对多关系 右键设计器新增关联 导航属性和外键属性可修改 2.多对多关系 右键设计器新增关联 模型设计完毕之后,根据右键设计器根据模型生 ...

  4. EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)

    日常开发中,经常会碰到一些自引用的实体,比如系统菜单.目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介 ...

  5. EF基础知识小记三(设计器=>数据库)

    本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...

  6. EF基础知识小记一

    1.EF等ORM解决方案出现的原因 因为软件开发中分析和解决问题的方法已经接近成熟,然后关系型数据库却没有,很多年来,数据依然是保存在表行列这样的模式里,所以,在面相对象和高度标准化的数据库中产生了一 ...

  7. Linq基础知识小记二

    书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1.方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1).链式查询 这种查询方式很多语 ...

  8. Linq基础知识小记四之操作EF

    1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...

  9. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

随机推荐

  1. 使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

    背景: yum包的管理是使用python写的,有对应的python版本   遇到的问题报错如下: File "/usr/bin/yum", line 30     except K ...

  2. Kolakoski

    Kolakoski序列:我们知道的还是太少 上帝创造了整数,其余的则是我们人类的事了.正因为如此,质数.完全数.Fibonacci 数之类的数列才会让数学家们如痴如醉,因为它们的存在是如此自然,没有任 ...

  3. DUBBO配置规则详解

    研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它, ...

  4. Netty Nio启动全流程

    Netty Nio启动全流程 1. 各组件之间的关系 说明:EventLoopGroup类似线程池,EventLoop为单线程,每个EventLoop关联一个Nio Selector,用于注册Chan ...

  5. ubuntu18.04 编译安装 apache php

    1. apache apache 需要依赖几个模块:apr, apr-util, pcre,也分别源码安装. 1.1 编译安装 1.1.1 apr apr-util 下载地址:http://apr.a ...

  6. css布局:定宽,自适应

    css三栏布局:1.中自:float,absolute,margin三种方法.2.中固:margin,table两种方法. 两边定宽,中间自适应: float: #left{ float:left; ...

  7. [redis] redis 如何删除匹配模式的多个key值

    redis-cli keys "user:*" | grep "user:[0-9]\+$" | xargs redis-cli DEL redis-cli k ...

  8. 【算法31】寻找数组的主元素(Majority Element)

    题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以 ...

  9. Golang Tcp粘包处理(转)

    在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name" ...

  10. python跳坑---生成器

    贵有恒,何必三更眠五更起,最无益,只怕一日曝十日寒. 好多东西要写下来一是方便自己,二可以分享给大家,我却一拖再拖. 工作的时候看别人代码中间结果,跳了个坑,关于python generator类型: ...