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操作数据库的时候 我们需要先获取连 ...
随机推荐
- codeforces 979C Kuro and Walking Route
题意: 给出一棵树,其中有两个点,x和y,限制走了x之后的路径上不能有y,问可以走的路径(u,v)有多少条,(u,v)和(v,u)考虑为两条不同的路径. 思路: 简单树形dp,dfs统计在x到y路径( ...
- 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】
在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...
- 【Hive学习之二】Hive SQL
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- HOG基本原理
图像识别,图像预处理,HOG算法介绍. 转自: https://blog.csdn.net/gy429476195/article/details/50156813
- 以太坊ETH中智能合约消耗的Gas、Gas Limit是什么?
以太坊ETH中智能合约消耗的Gas.Gas Limit是什么? 数字货币交易一般是有交易费的,比特币(BTC)的交易费很容易理解,就是直接支付一定额度的BTC作为手续费.而以太坊(ETH)的交易费表面 ...
- jenkins3
Jenkins是基于java开发的. GitHub Git (熟练使用) Doocker (了解) Jenkins (熟练使用) Django (熟练使用) Angularjs (了解) Sentry ...
- AEC、AGC、ANS在视音频会议中的作用?
AGC是自动增益补偿功能(Automatic Gain Control),AGC可以自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点.ANS是 ...
- 为了好好看球,学霸们用深度学习重建整个比赛3D全息图
http://mp.ofweek.com/vr/a745673021206 周四晚上11点,万众瞩目的世界杯终于开踢了,虽然意大利.荷兰.智利.中国(手动滑稽)等强队没能进入本届世界杯,但C罗梅西谁主 ...
- django 数据库html显示
template {% autoescape off %} {% for each in obj %} <h2>{{ each.food }}</h2> <br/> ...
- Java中的Volatile和synchronized的区别
Synchronized和Volatile四个不同点: 1.粒度不同,前者锁对象和类 ,后者针对变量2.syn阻塞,volatile线程不阻塞3.syn保证三大特性,volatile不保证原子性4.s ...