[转]Entity Framework技术导游系列开篇与热身
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/12779517
在微软平台写程序有年头了,随着微软数据存取技术的持续演化,我在程序中先后使用过ODBC、DAO、ADO、ADO.NET、LINQ to SQL、 Entity Framework这些技术。
近几年来,Entity Framework(后文简称EF)的地位日益上升,成为微软数据存取技术的主角,也是我个人在开发应用程序时首选的数据存取技术,同时我也在博客园等专业网站上看到业界许多项目也都使用了EF。我放在CSDN下载频道的几讲Entity Framework 5课件(http://download.csdn.net/detail/bitfan/5153110),目前也有近800人下载,数十人发表评论,可以推断有不少人正在或打算学习EF,于是就萌生了写一个专门针对EF的系列文章的想法,重点谈谈我对EF的认识。
Entity Framework系列文章初步计划分为以下几个部分,依据内容多少,每部分可能会继续分解成几篇文章,并且会持续修改。
一 走马观花——了解EntityFramework
二 寻幽探胜——深入了解EntityFramework技术要点
三 学以致用——在实际开发中使用EntityFramework
我主要从使用者的角度向大家展示EF这一技术的魅力,但不打算深入地介绍相关的技术细节,因为那需要整本书的篇幅。本系列文章的主要目的是为大家绘制一幅EF技术导航图,点出其技术关键点,并结合我个人的使用经验,对在开发中很可能会遇到的问题给出一些技术解决方案和建议,期望这些从实践中总结出来的东西能对正在学习与使用EF技术的朋友有所帮助。
还必须指出:EF本身是开源的,但由于时间有限,我并没有花时间去通读整个EF的源代码(如果真要精通EF,通读其源码是必须的),只是针对我觉得特别有用的场景进行了测试,并结合自己对EF的理解进行了总结和分析,有可能有不对的地方,敬请指出以便更正。
金旭亮
2013-10-16
EntityFramework走马观花之
热身准备
1 Entity Framework是什么?
EF是一种ORM(Object-relational mapping)框架,它能把我们在编程时使用对象映射到底层的数据库结构。比如,你可以在数据库中建立一个Order表,让它与程序中的Order类建立映射关系,这样一来,程序中的每个Order对象都对应着Order表中的一条记录,ORM框架负责把从数据库传回的记录集转换为对象,也可以依据对象当前所处的具体状态生成相应的SQL命令发给数据库,完成数据的存取工作(常见的数据存取操作可简称为CRUD:Create、Read、Update、Delete)。
2 为什么使用Entity Framework?
EF本身相当复杂,学习并掌握它需要花费不少的时间,那么,为什么我们要花这个时间?
就我自己的亲身感受,我觉得使用EF的好处有以下几点:
(1)能较大地提升数据库应用的开发效率
基于微软平台开发的人,恐怕没有人没有用过ADO.NET。ADO.NET提供了一整套与底层数据库结构相当一致的对象模型,易于使用,运行效率也高,在EF之前,绝大多数应用都直接使用ADO.NET。
ADO.NET其实很不错了,那还有什么必要使用EF?
就我的看法,简而言之:EF给数据库应用系统开发带来了更高的效率,使用它能更容易地写出易维护、易扩展的系统,而且性能虽然比不上ADO.NET,但也足够好,能满足大多数开发场景的需求。
与ADO.NET不一样,EF的抽象层次较高:它把数据库映射为DbContext,把数据库中存取的数据直接映射为实体(Entity)对象,屏蔽了底层的数据库内部结构,无需直接使用下层数据存取引擎所提供的底层对象(比如ADO.NET所提供的DbConnection,DbCommands等)完成CRUD。
仔细回顾一下软件技术发展的历史就会发现——软件技术主要通过提高抽象层次来提升软件开发效率。EF较之ADO.NET,它正是走的这条路。
(2)与ADO.NET一样,EF在使用上也很灵活:
只要提供一个EF 的Data Provider,EF就能使用多种关系数据库,而不是仅仅地绑定到微软的SQL Server,比如我就使用过EF把数据存储到MySQL中。
(3)EF是开放的:
EF本身开源,可以访问:http://entityframework.codeplex.com/SourceControl/latest下载源码。出现任何问题,可以直接看源码去。源码之前,了无秘密。开放给EF带来了生机与活力。
ADO.NET与EF之间其实是“井水不犯河水”,ADO.NET的抽象层次较低,性能较高,但开发效率与应对变化的能力不如EF,这不是说用ADO.NET就不能开发出兼有高性能与易扩展的应用,而是说EF在这方面很强,直接基于ADO.NET实现EF现在己经实现的功能,需要费不少劲,而这些功能在开发中基本上绕不开它们,你不用现成的,就得自己实现,最终你会发现,自己写的比不上EF开发者写的。
另一个值得一提的技术是LINQ toSQL,客观地说,这也是一个优秀的技术,但命运确实不好,“既生瑜,何生亮”,它曾经与EF争宠,但现在己被打入冷宫。诸位请忘记它吧,LINQ to SQL能做的,EF都能做。EF能做的,LINQ to SQL有些则做不了。
3 学习EF技术的前提
是不是什么人都能掌握EF?
不是的,如果想真正地用好EF,不花一点功夫是不可能的,而一些知识与技术不具备,也是不行的。以下是我总结的“学习与掌握EF的前提条件”,如果不满足以下任何一点,先别急着一头钻进来,估计你会找不着北的。
(1)掌握ADO.NET和SQL Server数据库的基本使用方法
虽然使用EF开发基本不需要与底层数据库存取引擎和数据库打交道,但你还是必须要知道他们的基础知识。比如,如果你不知道怎样使用DbConnection对象连接数据库,不知道怎样使用DbCommand向数据库发送SQL命令,不会用SQL Server Management Studio,不会编写SQL命令,……,那么,你还是先把这些学会再说吧。
特别地,强烈建议掌握SQLProfiler的用法,在技术探索过程中,我们需要用它来观察EF发出的SQL命令,以便更深入地了解其特性。
这里简单地说一下如何安装SQLProfiler。默认情况下,免费版本的SQL Express是不带SQL Profiler这一工具的,但我们有一个取巧的方法:
首先安装SQL ServerExpress,完成之后,到微软网站下载SQL Server完整版的安装包,在安装时选择“向现有实例添加功能”,在安装选项时选中“管理工具——完整”,如下图所示:
哈,现在免费的Express版本也能使用SQL Profiler了。
(2)掌握LINQ、Lambda表达式、与数据集合查询相关的扩展方法
EF支持LINQ to Entities编写的查询,我们也可以直接使用诸如FirstOrDefault()、Skip()之类针对IEnumerable/IQueryable集合对象的扩展方法完成数据查询工作,在开发中编写Lambda表达式实在是家常便饭,从其它语言转过来的朋友请先熟悉它。
(3)OOP编程基本技能与ORM的基础知识。
以下几个问题可用于自我测试:
- 对象间主要有三种关联类型:一对一,一对多,多对多,如何用C#编程实现?
- 如果要把拥有上述三种关联类型的对象保存到数据库中,这些对象间的关联应该如何映射到数据库表上?
- 特别地,如果对象之间存在着继承关系,又该如何处理?
- ……
掌握这部分内容非常重要,实际开发中出现的问题很多是与它相关的,自己去找书看吧。
(4)安装Visual Studio,访问官方网站
在Visual Studio中使用EF很简单,首先创建一个项目,然后使用NuGet搜索Entity Framework:
在计算机不能联网的情况下,则可以向项目中添加一个ADO.NET Entity Data Model(下图),完成向导之后,所有相关的项目引用就都设置好了:
本人强力推荐使用NuGet方式。
另外,推荐安装EntityFramework Power Tools(http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d),如果使用Code First方式(后面介绍)开发数据库应用,使用这个工具能分析现有代码并生成可视的模型视图(只读),也能从现有数据库中生成所有数据实体,特别有趣地,它还可以直接为数据模型生成预编译视图减少程序装载时间,功能强大。
Entity FrameworkPower Tools目前最新版本是BETA 4,还不成熟,存在着一些功能缺陷,比如现有版本不能只选择数据库中选择部分表生成数据实体类,这一工具真正达到成熟、稳定和实用还有较长的路。
最后介绍一下EF相关的学习资料:
首先是正式出版的技术书籍,在EF这块,最有名的是Julie Lerman(她是女性)写的三本技术书籍,她还在pluralsight网站录制了不少视频。
EF在MSDN上的官方网站是:
http://msdn.microsoft.com/zh-cn/data/ee712907
此网站上有对EF各个技术点的详细介绍。
另一个大本营则在ASP.NET上,其网址为:http://www.asp.net/entity-framework,提供了不错的教程。
在Channel 9(http://channel9.msdn.com)上可以看一些与EF有关的技术视频,其中有对EF最新版本6的介绍。
最后,stackoverflow网站(http://stackoverflow.com/)是解决实际开发中遇到问题的最佳地点,上面有大量与Entity Framework相关的问答,极具价值。
上述介绍的都是英文技术资源,E文不好的可以看看博客园(http://www.cnblogs.com/),上面有不少国内技术高人写的与EF相关的博客,很多都有价值。
[转]Entity Framework技术导游系列开篇与热身的更多相关文章
- 【转】Entity Framework技术导游系列开篇与热身
转自:http://blog.csdn.net/bitfan/article/details/12779517 Entity Framework走马观花 之 把握全局 ================ ...
- Entity Framework技术导游系列开篇与热身
在微软平台写程序有年头了,随着微软数据存取技术的持续演化,我在程序中先后使用过ODBC.DAO.ADO.ADO.NET.LINQ to SQL. Entity Framework这些技术. 近几年来, ...
- Entity Framework技术导游系列 开篇 (转)
在微软平台写程序有年头了,随着微软数据存取技术的持续演化,我在程序中先后使用过ODBC.DAO.ADO.ADO.NET.LINQ to SQL. Entity Framework这些技术. 近几年来, ...
- Entity Framework技术系列之0:开篇
小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...
- 【转】Entity Framework技术系列之7:LINQ to Entities
前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...
- Entity Framework 6 开发系列 目录
2014 年开始接触 Entity Framework 6 也快两年,用它已经沉淀了一个成熟架构,也用来开发了不少大大小小的产品和项目,直到这段时间,才真正有时间来回顾,重新学习它,为让大家更加了解E ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- 基于.NET的微软ORM框架视频教程(Entity Framework技术)
基于.NET的微软ORM框架视频教程(Entity Framework技术) 第一讲 ORM映射 第二讲 初识EntifyFramework框架 第三讲 LINQ表达式查询 第四讲 LINQ方法查询 ...
- Entity Framework 技术参考:http://kb.cnblogs.com/zt/ef/
Entity Framework 技术参考:http://kb.cnblogs.com/zt/ef/
随机推荐
- Javascript 笔记与总结(2-3)Javascript 运算符、控制结构与对象操作
[连接运算符 + ] <script> console.log(1+2+'a'+3+4); </script> 输出: 3a34 [逻辑运算符]返回的是最早能判断表达式结果的那 ...
- 使用php作linux自动执行脚本
使用php作linux自动执行脚本 [来源] 达内 [编辑] 达内 [时间]2013-03-21 在作社区时, 时常需要统计上线人数等数据. 一般做法是, 把这段代码放在用户 login或者 ...
- mysql安装tcmalloc
TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ...
- SQL注入攻击和防御
部分整理... 什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...
- Windows与Linux共享文件夹互相访问
[原文] 首先安装并配置软件samba [html] view plain copy sudo yum install samba samba-client vim /etc/samba/smb.c ...
- java override
java override // 覆盖父类的方法,在子类直接调用子类内部这个方法时 public class TestCalc{ protected static class Wine{ String ...
- POJ 1236 Network of Schools (Tarjan + 缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12240 Accepted: 48 ...
- v2.0
#include <stdio.h>#include <string.h>#include <ctype.h>typedef struct node{ char l ...
- js 判断js函数、变量是否存在
//是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == "function&q ...
- Redis学习笔记(1)-Key
package cn.com; import java.text.ParseException; import java.util.List; import java.util.Set; import ...