ADO.NET 之 Entity Framework 基础
Entity Framework(EF)是使用直接映射到应用程序中业务对象的对象模型于关系数据库进行交互。它没有将数据视为行和列的集合,而是将其视为强类型对象(成为实体)的集合。
术语:LinQ to Entity 是指ADO.NET EF实体对象使用LINQ查询。 LINQ TO SQL 与 ADO.NET EF接近,但使用的情况很少,有一次使用LinQ to SQL 做过一个小网站,感觉比三层使用方便一些,但数据量不大也就无所谓了。 LinQ to SQL 查询 的介绍。
EF模式会使代码库显得复杂,如果你掌握LINQ,使用EF还是很好的。小量数据可以还是使用以前的,如果数据量比较大使用EF就很好。
实体的作用
强类型称为实体。正式名称为 实体数据模型 (EDM) 。它是一组映射到物理数据库的客户端类,但是这些实体没有必要与数据库架构的命名约定完全一致。你可以根据具体的情况该名称,定义不同的属性名,这些属性讲映射到目标表的各个列。
在大多数情况下,客户端实体类的名称都与关系型数据库表相同,你也可以修改它的名称,主要看情况。
Entity Framework 的基础知识
EF API 的两个关键部分为 对象服务 和 实体客户端。
①对象服务的作用
对象服务是EF中的一部分,它在代码中对客户端实体进行控制。例如:对象服务跟踪你对实体的更改(如将汽车的颜色由绿色改为红色),管理实体间的关系(如查找用户Steve Hagen的所有订单)并提供将更改保存到数据库的方法,以及用XML或二进制序列化服务对实体状态进行持久化的方法。
对象服务层对所有扩展EntityObject基类的类进行管理,EntityObject是EF编程模型中所有实体类的基类。
②实体客户端的作用
EF API的另一个主要部分是实体客户端,它使用基本的ADO.NET数据提供程序来建立数据库连接,基于实体状态和LINQ查询生成SQL语句、将数据库数据映射到实体。
System.Data.EntityClient的命名空间中浏览实体客户端层的功能。包含了一些的类。
可以看出这些类(EntityCommand和EntityConnection)与ADO.NET数据提供程序中的类惊人地相似。
如果你需要更大程度地控制实体客户端基于Linq查询创建SQL语句的方式,你可以使用Entity SQL。它是直接作用于实体的与数据库无关SQL方言。
③*.edmx文件的作用
实体、真正的数据库以及映射层都会被划分为3个相关的部分:概念模型、逻辑模型和物理模型。
① 概念模型定义实体以及他们之间的关系(如果有的话)
②逻辑模型将实体和关系(通过外键约束)映射到表
③ 物理模型通过指定的存储细节(如表架构、表分割和索引)来表示特定的数据引擎的能力
在EF的世界里,这三层存存放在基于XML格式的文件里。
*.edmx 文件将生成3个独立的文件:用于概念模型数据的*.csdl、用于物理模型的*.ssdl、和用于映射层的*.msl.然后这三个基于XML的文件将以二进制资源的形式绑定到应用程序。
④ 书中使用的是4.0版本的,有点老了。。。。。 后面低版本更新为 DbContext和DbSet<T>了 代码演示的就DbContext个DbSet<T>了
ObjectContext和ObjectSet<T>类的作用
EF的最后一个难点是ObjectContext类,他是 System.Data.Object命名空间的一员。在生成*.emdx文件时,你将得到映射到数据库表的实体类和一个继承自ObjectContext类。该类通常用于对象服务于实体客户端之间的交互。
ObjectContect的常用成员
ObjectContent的派生类作为一个容器,管理哪些存储在ObjectSet<T>集合中的实体对象。例如:你在AutoLot数据库的Car表生成*.edmx文件,你会的得到一个AutoLotEntities类。
该类包含一个Cars属性(复数形式),它封装ObjectSet<Car>类型的数据成员。Orsers表创建一个EDM,AutoLotEntitesl类将定义另一个Orders属性,还封装ObjectSet<Order>类型的成员变量。
System.Data.ObjectSet<T>的一些常用成员
如果对LinQ To SQL有了解的话这个位置就很好了解了,基本一样。
创建和分析EDM
解决方案资源管理器里面
这个并不能让我们很好了解EDM,我们需要借助模型浏览器来帮助我们。
视图——》其他窗口——》实体数据模型浏览器
主要是模型,表等一些的介绍
可以修改属性
视图——》其他窗口——》实体数据模型映射详细信息
查看生成d*.edmx文件的数据
右键决解方案中的NewsEDM.edmx打开方式
、
查看生成的源代码
补充:
System.Data.Entity;
DbContext类的介绍
Entry这个方法一般可以用来改变实体的状态
DbEntityEntry 在命名空间 System.Data.Entity.Infrastructure
这个常用
返回的是 EntityState,是个枚举类型
一般这么用
context.Entry<News>(news的实例).State = EntityState.Deleted; //把你需要改变的类传到这个方法里面然后改变状态最后提交到数据库中就可以了
DbSet<T>类 context.News————》返回的就是 DbSet<News>
对概念模型进行编程
添加
//新建一个实例 using (NewsDBEntities context=new NewsDBEntities()) { try { //添加一个新类到上下文 context.News.Add(new News() { CateID = 2, Contents = "测试类容", CreateDate = DateTime.Now, Title = "测试标题" }); context.SaveChanges(); //保存到数据库 如同执行了一条SQL Insert语句 } catch (Exception ex) { Console.WriteLine(ex.InnerException.Message); } }
数据库中多了一条信息
删除
//新建一个实例 using (NewsDBEntities context=new NewsDBEntities()) { //找到你需要删除的信息 //① News dd = context.News.First(x => x.NewsID == 3); context.Entry<News>(dd).State = EntityState.Deleted; //改变状态 这里或者给强类型,看具体情况 //context.Entry(dd).State = EntityState.Deleted = context.News.Remove(newDel) 一个意思 //② 注意LinQ查询 返回单个 News newDel = context.News.Where(x => x.NewsID == 5).First(); context.News.Remove(newDel); context.SaveChanges(); //提交数据库 }
更新
把需要更新的数据找出来,然后改变属性直接提交到数据库
查询就跟LinQ查询一回事。这里就只是演示了简单的增删改查。
总结:这里只是简单的了解了一下EF,到时候会继续学习更深层的。