Entity Framework实体框架(EF)是ADO.NET的开源对象关系映射(ORM)框架,它是.NET Framework的一部分,是一组支持开发面向数据的软件应用程序的技术。微软为实现.NET跨平台,将EF从.NET分离,使EF更加组件化。2016年6月27日,Entity Framework 7作为实体框架核心1.0发布,与ASP.Net Core 1.0和.Net Core 1.0一起发布,重命名为凸显出它是完全重新而不是增量升级,同时,EF7并不会取代EF6。
在EF中的实体数据模型(EDM)由以下三种模型和具有相应文件扩展名的映射文件进行定义。
概念架构定义语言文件(.csdl)——定义概念模型
存储架构定义语言文件(.ssdl)——定义存储模型
映射规范语言文件(.msl)——定义存储模型与概念模型之间的映射M。实体框架 使用这些基于XML的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新、和删除操作转换为数据源中的等效操作。EDM甚至支持将概念模型中的实体映射到数据源中的存储过程。
ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
广义上来说,ORM可以被认为是 面向对象模型和关系型数据库的数据结构之间的相互转换。
狭义上来说,ORM可以被认为是,基于关系型数据库的数据存储,实现了一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面对对象的接口,持续化一个OO对象应该不需要了解任何关系型数据库存储数据的实现细节。
其他.NET ORM框架:
- PetaPoco :
与完备的ORM框架不同,PetaPoco更加注重易用性和性能。使用PataPoco只需要引入一个C#文件,可以使用强类型的POCO(Plain Old CLR Object),并支持 T4 模板生成的类等。此外,由于PetaPoco是开源项目,因此添加条件来处理如空间数据等特定情况会很容易。- Dapper :
性能方面高于PetaPoco,速度只稍逊于手工编码的数据访问层(DAL、Data AccessLayer),还有一些对初学者会有帮助的、位于官网上的系列博文和一些独立博文教程。
1.使用EF,创建Model (DataFirst)
- 在解决方案中,创建所使用的项目。例如:ASP网站项目、WinForm窗体项目……
- 在新建的项目中,添加 > 新建项 > 数据 > ADO.NET实体数据模型(.edmx)
- 在新建的.edmx中选择:从数据库生成(DatabaseFirst)
- 选择新建连接,填写连接数据库 > 填写登录数据库信息 > 选择或输入需要生成模型的数据库名称.
- 选择需要创建模型的表、视图、存储过程
- 点击下一步,直接生成(有些电脑可能会出现警告信息,忽视即可)。
2.使用EF创建的内容
0.创建完成后,项目会默认引入两个命名空间:EntityFramework、System.Data.Entity
1. 最外层为.edmx文件,EF模型设计器,展示从数据库创建的模型,包括:表名、属性(表字段)、导航属性(外键、表与表之间的对应关系)、表与表之间1对1、1对多的关系。
2. Model1.Context.tt、Model.Designer.cs、Model.edmx.diagram、Model1.tt
1). Model1.Context.tt:包含Model1.Context.cs
Model1.Context.tt由T4模板生成,不可更改,Model1.Context.cs继承自DbContext,包括构造方法(继承自父类的构造方法,并在此传递配置文件的数据库连接字符串)、各个表所对应的Dbset<T>类型的自动属性。
2). Model.Designer.cs:自动生成,无需更改
3) . Model.edmx.diagram:描述edmx文件的元素信息(名称、位置……)
4). Model1.tt:包含生成的Model.cs,自身由T4模板生成,无需修改
3.使用EF进行增删改查
查询
1 StudentMISEntities stu = new StudentMISEntities(); 2 //IQueryable<Users> userInfoList=from u in stu.Users 3 var userInfoList = from u in stu.Users 4 where u.id == 10 5 select u; 6 foreach (var item in userInfoList)//EF延迟加载机制,数据用到的时候才去数据库中查询,不用的时候不去查询,提高程序性能 7 { 8 Response.Write(item.uName); 9 }
增加
1 Users userInfo = new Users(); 2 userInfo.uName = "2333"; 3 userInfo.uPassword = "123"; 4 userInfo.uRole = "学生"; 5 6 StudentMISEntities stu = new StudentMISEntities();//创建EF数据操作类实例 7 stu.Users.Add(userInfo);//把数据添加到EF,并添加标记 8 stu.SaveChanges();//把数据保存到数据库
修改
StudentMISEntities stu = new StudentMISEntities(); var userInfoList = from u in stu.Users where u.id == 16 select u; Users userInfo = userInfoList.FirstOrDefault();//返回第一个元素,如果没有的话,返回null if (userInfo!=null) { userInfo.uPassword = "12345678"; stu.Entry<Users>(userInfo).State = System.Data.Entity.EntityState.Modified;//添加修改标记 stu.SaveChanges(); Response.Write(userInfo.uPassword); } else { Response.Write("要修改的数据不存在"); }
删除
1 StudentMISEntities stu = new StudentMISEntities(); 2 var userInfoList = from u in stu.Users 3 where u.id == 17 4 select u; 5 Users userInfo = userInfoList.FirstOrDefault();//返回第一个元素,如果没有的话,返回null 6 if (userInfo!=null) 7 { 8 //stu.Users.Remove(userInfo); 9 stu.Entry<Users>(userInfo).State = System.Data.Entity.EntityState.Deleted;//添加删除标记 10 stu.SaveChanges(); 11 Response.Write("已删除"); 12 } 13 else 14 { 15 Response.Write("要删除的数据不存在"); 16 }