ORM之EF
本文大部分内容截取自博客: http://www.cnblogs.com/VolcanoCloud/p/4475119.html
(一) 为什么用ORM
处理关系数据库时,我们依据由行和列组成的表,它高度结构化且擅长处理记录集。在面向对象编程被广泛接受之前,我们使用“procedurally(过程化)”的思维并通过编写结构化的、自上而下的、一个一个的函数来解决问题。它们完美对应:在代码中,表、行、列和结构化、过程化模式完美匹配。这样的情况,持续了很长一段时间。
在编码方面,我们现在使用面向对象和领域模型,架构、设计和编码都对应于现实世界中的事情,比如客户和订单。我们在白板上写出问题域(problem space)中的名词,通过绘制它们之间的连线来表示关联和交互。并以此作为规范和给开发团队分配工作的依据。总之,架构、设计、和编码是基于概念层,已经和关系型数据库的组织和逻辑有很大的差别。
软件开发中分析和解决问题的方法已经进化成熟,然而关系型数据库却没有。很多年来,数据依然是保持在表、行、列这样模式里。不幸的是,它在面向对象继承和高度标准化的关系型数据库中产生了一个失配(阻抗失配,微软的安德斯.海尔斯伯格<C#之父>可能会这样叫它)。
为了应对这一差距,项目中经常引入“数据库层(database layer)”来转换应用程序领域实体类中数据到表中的行和列进行保存。由此产生了许多商业和开发的数据库访问框架。他们都希望在进化式的开发和结构化数据中架起一座桥。有趣的是,一个新的解决方案-对象关系映射(ORM)产生了。
实体框架,以及集成查询语言(LINQ)框架,他们均出自微软,使我们能处理抗阻失配问题。使用实体框架,我们能在设计器或是代码中直接对领域实体类进行建模。还能建立实体类之间的关系。面对这些实体类以及他们之间的关系我们构建LINQ查询来应对,LINQ允许我们在代码中使用实体类以及他们之间的关系来表达关系型数据库中的概念。这些在帮助我们减少开发工作量的同时,还有助于简化我们的开发体验。相对大量、高度冗余代码的ADO.NET数据访问方式,我们使用LINQ查询来表达我们对数据的需求。使用面向实体对象编程方式代替面向高度结构化的关系型数据库开发方式,实体框架会帮你实现实体类到底层数据库的映射。
(二) 使用VS进行开发
我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成、支持软件开发整个生命周期的多语言环境。 Visual Studio以及它发布的工具和服务提供了:设计、开发、单元测试、调试、软件配置和管理、构建管理和持续集成等等。很少有开发人员因为还没有使用它而担心(注:作者应该是表达不用担心VS的能力),Visual Studio是一个完整的工具集。Visual Studio在开发应用实体框架的应用程序中起着至关重要的作用。
Visual Studio为实体框架模型提供了一个集成的设计器,使用它提供的工具,你可以从头创建或者从已存在的数据库创建模型。当然,你可以选择不使用设计器,纯手工来创建实体类型和配置。
多数情况下,我们拥有一个已经存在的应用和数据库,VisualStudio为我们提供了工具,它可以帮我们把数据库中的表和关系导入到实体框架模型。这非常适合我们,因为很少有人会奢侈选择开发一个崭新的应用程序。多数情况下我们是维护、扩展、改进一个已存在的代码和数据库。
你可以在计器中创建一个空模型,然后从头开始增加实体类型、类型间的关联以及承继体系到设计器中。 当你创建好模型后,你可以右键设计器,然后从菜单中选择从模型创建数据库。
如果你的项目团队是以代码为中心的,你可以在不使用设计器的情况下手工创建一系列的领域类、它们之间的关系、上下文对象,然后把这些类和实体框架引擎关联起来。
一旦创建好模型,改动是经常发生的,因为这对软件开发来说是再自然不过的事。Visual Studio提供了工具帮我们从数据库更新我们的模型,这会使模型和数据库同步。另外,实体框架开发团队还为我们提供了一个名为代码优先迁移(Code First Migrations)工具,它能让数据库保持你模型中最新的修改。
(三) EF的三种approach
从已存在数据库创建模型是数据库优先(Database-First)方案。从你选择的数据库的表、视图、存储过程,向导会为创建好模型和用于编码的实体类。立马得到的好处就是,你可以在编码中使用实体框架从数据库中的表和列映射到模型中的强类型的实体类。如果数据库中的表间是有关系的,他们会被建模成关联。如果你有一个已经存在的数据库,这是为你的应用创建实体数据模型的一种方式。然而,如果你喜欢使用代码优先(Code-First)方案从一个已存在的数据库创建模型,不用担心,实体框架开发团队已经创建了强有力的工具集(The Entity Framework Power Tools),它通过逆向工程,从一个存在的数据库创建领域实体类,就像你手工敲出来的一样。
如果你开发一个崭新的应用,没有已存在的数据库,你同样也可以选择实体框架设计器。先创建一个空的模型,然后通过右键创建实体类型、关联、继承。也可以从工具箱中拖拽到设计器中创建它们。一旦建模完成,你就可以右键设计器选择 Generate Database from Model(从模型创建数据库)菜单项。它会产生一个用来创建数据库表、关系的脚本。
我自己在工作当中或多或少都接触到了EF的使用,也将自己的所学所得总结出来,方便自己也请他人帮助斧正.
ORM之EF的更多相关文章
- 分库分表、读写分离——用Sql和ORM(EF)来实现
分库:将海量数据分成多个库保存,比如:2017年的订单库——Order2017,2018年的订单库——Order2018... 分表:水平分表(Order拆成Order1.....12).垂直分表(O ...
- ORM框架EF
应用程序和数据库采用Tcp协议通讯 ORM框架有: NHibernate ,Dapper ,Mybatis 底层是 ADO.Net 好处: 1.面向对象 2.没有sql减少学习成本,快速开发 3.编译 ...
- MVC系列学习(二)-初步了解ORM框架-EF
1.新建 一个控制台项目 2.添加一个数据项 a.选择数据库 注:数据库中的表如下: b.选择EF版本 c.选择表 3.初步了解EF框架 看到了多了一个以 edmx后缀的文件 在edmx文件上,右击打 ...
- ORM之EF初识
之前有写过ef的codefirst,今天来更进一步认识EF! 一:EF的初步认识 ORM(Object Relational Mapping):对象关系映射,其实就是一种对数据访问的封装.主要实现流程 ...
- ORM框架 EF - code first 的封装
Code first 是Microsoft Entity Framework中的一种模式,CodeFirst不会有可视化的界面来进行拖动编辑DataBase-Entity,但会以一个类来进行对数据表关 ...
- ORM框架 EF - code first 的封装 优化一
上一节我们讲到对EF(EntityFramework)的初步封装,任何事情都不可能一蹴而就,通过大量的实际项目的实战,也发现了其中的各种问题.在这一章中,我们对上一章的EF_Helper_DG进行优化 ...
- ORM 之 EF的使用(一)
早期对数据库进行操作 通过Ado.Net 操作数据库 需要操作sqlCommand/sqlConnection/adapter/datareader 如图 后来 基于面向对象的思想 出现了中间件ORM ...
- 模拟EF CodeFist 实现自己的ORM
一.什么是ORM 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单来说,ORM 是通过使用描述对象 ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
随机推荐
- libvirt_python
一.Connections 连接函数接口libvirt.open(name); //可读写方式连接上QEMU 参数说明: name:连接名称libvirt.openAuth(uri, auth, fl ...
- tomcat的JVM调优
1.error场景 Tomcat 长期运行过程遇到Caused by: java.lang.OutOfMemoryError: PermGen space或java.lang.OutOfMemoryE ...
- ubuntu16.04——WingIDE安装 操作服务器是一件很好玩的事情
1.在服务器上部署环境时,区分linux 系统和winddos系统 2.下载安装包: 3.输入命令操作 4.进入相对应的目录下: 5.命令 6.发生错误,更新环境 7.安装成功
- FileInputstream,FileOutputstream 和 byteArrayInputStream,byteArrayOutputStream
你知道FileInputstream和FileOutputstream吗?FileInputstream,FileOutputstream分别是由抽象类Inputstream和Outputstream ...
- mysql的sql执行计划详解
实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写 ...
- Hive的join表连接查询的一些注意事项
Hive支持的表连接查询的语法: join_table: table_reference JOIN table_factor [join_condition] | table_reference {L ...
- python的print函数自动换行及其避免
print函数自带换行功能,即在输出内容后会自动换行,但是有时我们并不需要这个功能,那怎么办呢?这时候就需要用到end这个参数了,使用方法参考下面这段打印$矩阵的代码: i = 1 while i&l ...
- Linux基础命令---显示路由表route
route route指令用于显示或者修改IP路由表.它的主要用途是在使用ifconfig(8)程序配置接口后,通过接口设置到特定主机或网络的静态路由.当使用add或del选项时,路由将修改路由表.如 ...
- 有登陆认证的情况下如何使用Wisdom RESTClient?
访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...
- Django基础(10): URL重定向的HttpResponseDirect, redirect和reverse的用法详解
利用django开发web应用, 我们经常需要进行URL重定向,有时候还需要给URL传递额外的参数.比如用户添加文章完成后需要转到文章列表或某篇文章详情.因此熟练掌握HttpResponseDirec ...