初探Entity Framework
一、Entity Framework到底是什么
Entity Framework(又称ADO.NET EntityFramework)是微软ADO.NET为基础发展出来的对象关系对应(O/R Mapping)解决方案,早期被称为ObjectSpace。
长久以来,程序员与数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的组件,这让程序员一定要为了连接和访问数据库而去学习SQL指令,因此在信息业中有很多人都在研究如何将设计模型和数据库集成在一起,对象关系对应(Object-Relational Mapping)的技术就是由此而生,像Hibernate或NHibernate都是这个技术下的产物,而微软虽然有了ADO.NET这个数据访问的利器,但却没有像NHibernate这样的对象对应工具,因此微软在.NET Framework 2.0发展时期,就提出了一个ObjectSpace的概念,ObjectSpace可以让应用程序用完全对象化的方法连接与访问数据库,其技术概念与NHibernate相当类似,然而ObjectSpace工程相当大,在.NET Framework 2.0完成时仍无法全部完成,因此微软将ObjectSpace纳入下一版本的.NET Framework中,并且再加上一个设计的工具(Designer),构成了现在的ADO.NET Entity Framework。
简言之就是通过使用EF,可以不用写一行SQL语句便可以对数据库进行相应操作。
二、预备知识
C# 3.0 部分特性
1.隐式类型的局部变量(Implicity Typed Local Variables)
var关键字只是编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户自定义类型或.NET Framework类型库定义的类型。
注意以下几点:
var a; //错误,等号右侧没有用来推断类型的初始化器 var b=null; //错误,不能将变量初始化为null var c={1,2,3}; //错误,不能将变量初始化为集合或对象初始化器 var d="caicai"; d=123; //错误,类型一旦确定将不可更改,想要更改可以考虑使用dynamic
虽然var可以帮助我们推断类型,但为了提高代码的可读性,还是少写为妙。
2.扩展方法(Extension Methods)
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
设想你需要在系统提供的某个方法基础上增加一些功能,你可以重写该方法并放到一个静态类中供所有类使用,但这样的话若是使用的次数较少还好,次数较多时,每次使用都需要调用另一个类的方法,还是有点小麻烦,设想如果像ToString()方法一样直接可以.出来就好了,由此引入了扩展方法。让我们看看下面的小Demo。
public static class Exc { public static string ToStringExc(this string str) //括号里面的不是方法参数,而是指明了扩展自何种类型 { return "我是扩展方法:"+str; } }

由此可见,扩展方法使用起来更为方便。
扩展方法三要素:静态类、静态方法、this关键字
注意:当扩展方法与实例方法具有相同的签名时,优先调用实例方法。
3.Lambda表达式(Lambda Expressions)
Lambda表达式是一种可用于创建委托或表达是目录树类型的匿名函数。通过使用Lambda表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。
在解释Lambda表达式之前有必要说说匿名方法。
匿名方法可以让程序员在不指定方法名的情况下声明一个方法,它只能在使用委托的时候创建。
不写方法名已经使得方法声明变得较为简单,但程序员觉得还不够,便引入了Lambda表达式。从匿名方法到Lambda表达式,首先删除delegate关键字,在参数列表和方法体之间加上“=>”即Lambda运算符(读作goes to)。然而,编译器可以通过推断,允许我们进一步简化Lambda表达式。首先编译器可以从委托的声明中知道委托参数的类型,从而可以省略参数的类型,其次,如果只有一个参数,还可以省略参数外的圆括号(没有参数或参数有多个时圆括号不可以省略),最后,如果方法体中包含一个返回语句,可以将语句替换为return关键字后的表达式。
PlusOne p = delegate(int a) { return ++a; }; //匿名方法 PlusOne p = (int a)=>{ return ++a; }; //Lambda表达式 PlusOne p = (a)=>{ return ++a; }; //Lambda表达式 PlusOne p = a =>{ return ++a; }; //Lambda表达式 PlusOne p = a => ++a; //Lambda表达式
4.对象、集合初始化器(Object and Collection Initializers)
所谓的对象初始化器就是在对象创建时增加一个大括号,并在其中添加成员的初始化列表。它也是一种语法改进,可以进一步提高代码编写效率。集合初始化器与此同理。
Person p=new Person(); //常见的对象初始化 p.Name="boyoung"; p.Age=35; Person p=new Person //使用对象初始化器初始化对象 { Name="boyoung", Age=35 };
List<Person> list=new List<Person>(); //常见的集合初始化 list.Add(new Person()); list.Add(new Person()); List<Person> list=new List<Person> //使用集合初始化器初始化集合 { new Person(), new Person() };
5.匿名类型(Anonymous Types)
匿名类型顾名思义就是没有定义类型的类型,其类型是由对象初始化器推断得出的类型,并在编译后自动创建的,仅限于当前上下文使用。看看下面的小Demo。
var Person = new {Name="boyoung",Age=35};
关于匿名类型的作用域:
由于匿名类型缺乏显式的类型定义,所以无法在方法之间传递匿名类型。要想获取匿名类型的各属性值只能通过反射的方式动态的获取。
6.自动属性(Automatically Implemented Properties)
自动属性可以使属性声明更加简洁。自动属性会自动生成私有变量,不需要显式的声明,并且可以直接通过对象初始值设定项对可访问的属性和字段赋值。
private string _message //声明属性 public string Message { get{ return _message; } set{ _message=value; } } public string Message{ get; set; } //自动属性(内部实现与上面的代码完全相同,只是编译器帮我们完成了重复的工作,看着是不是清爽了很多)
三、EF初探
很多人一提到EF感觉很高大上的感觉,其实EF本质还是ADO.NET操作,可以将它看作一套支持面向对象的超巨型SqlHelper。
下面带你揭开EF的神秘面纱,试着不写一句Sql语句对数据库进行增删改查操作。
创建实体数据模型
1.使用EF首先要建立一个实体对象模型,在项目名上右键添加新建项里选择

2.然后可以看到有两个选项,第一项是通过数据库建模的,第二项空模型是先建模然后根据模板创建数据库,他们之间可以相互映射。

后面的设置都按自己的需求来就好了。
设置好之后在解决方案资源管理器中可以看到新生成的后缀名为.edmx的文件。

增删改查操作
1.增加

不敢相信吧,没写一行sql语句,只需这么几行代码就可以完成添加操作,下面的删除修改查询也是同样的简单。
2.删除

3.修改

4.查询
简单查询

复杂查询(条件排序分页)
EF支持链式编程,可以无限添加条件排序分页等语句。(好强大,膜拜啊!)

学习EF仅一天的小菜鸟的EF初探就先到此,明天开始每天都要把自己的学习心得体会像这样记录下来~
浙公网安备 33010602011771号