ADO.NET Entity Framework简介

转载 2012年03月31日 11:41:10

下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序需要模型之间的鸿沟,那么它是怎么做到的呢?

我们都知道,建立在关系数据库基础之上的应用程序经常需要在不同的表之间做复杂的join操作来取得相关的数据。

比如下面的例子:

           [图1] 

这是一个普通的关系型数据库。这个结构主要描述了雇员的基本信息和雇员的销售情况。

假如我们想取得所有在2006年1月1日招聘过来的全职员工的姓名和职务信息,那么就需要写如下的sql查询语句:

1SELECT c.FirstName, e.Title
2FROM Employee e
3INNER JOIN Contact c ON e.EmployeeID = c.ContactID
4WHERE e.SalariedFlag = 1 AND e.HireDate >= '2006-01-01'
5


我们分析一下这个复杂的sql语句,就会发现它存在如下缺点:

1. 如果某个应用程序只处理Employees的信息,但我们必须将逻辑数据关系标准化。这样我们就不得不去关注数据库表与表之间的关系(比如雇员的联系信息和姓名在不同的表中),我们需要人为地在两个表中做内联交叉查询以得到正确的数据。
2.这里该应用程序仅仅是处理全职雇员(SalariedFlag=1),理想的情况是,我们不应看到其他类型的雇员信息。然而实际上所有的雇员信息都在一个数据库表中,他们是用一个"SalariedFlag"字段来区分的。这就意味着我们需要关注如何将不同类型的雇员加以区分。理想的情况是这样的:假如我们只需要处理某个数据子集,系统只需要呈现这部分子集的数据。开发人员应当能够通过声明来指定哪个是需要的数据子集。

综合地说,首先,关系数据模型不能直接匹配应用程序实际的数据模型。其次,关系数据模型不能满足应用程序的实际需要,比如应用程序还需要一些非功能性的需求,这些需求包括操作,数据拥有关系,性能和安全。

为了解决如上问题,ADO.NET引入了Entity Framework,它包含了数据模型以及一些设计时和运行时的服务。通过Entity Framework提供的更高抽象层,应用程序的数据模型就可以直接和数据库的关系数据模型交互。


Entity Data Model

Entity Data Model—简称EDM—是一个实体关系数据模型(Entity-Relationship data model). EDM的一个关键的概念如下:

Entity: Entity是实体类型的实例(例如:Employee, SalesOrder)。它由一个关键字来组织数据记录。多个Entity可以组成Entity-Sets.

RelationShip:RelationShip是关系类型的实例,它关联相关的实体.多个Relationships 可以组成 Relationship-Sets.

除了上面两个核心概念外,EDM模型还支持多种类型的扩展.

继承:实体类型可以继承于其他的类型.这种类型的继承只继承结构,不提供向面向对象语言的"行为"继承.

复合类型:定义一个复合类型Address,它可以由StreetAddress, City 和State这些属性复合而成.


我们按照EDM的概念重新定义[图1]:

             [图2]
这里描述了如下元素:
三个实体类型,分别是SalesPerson,SalesOrder和StoreSalesOrder。其中StoreSalesOrder继承自SalesOrder。
一个关系: SalesOrder 和 SalesPerson 之间的关系。
两个实体集(entity-sets):SalesOrders 和 SalesPeople。 实体集SalesOrders 拥有SalesOrder和StoreSalesOrder两个实体类型。

看看上面的模型视图已经更接近应用程序需求了。其中SalesPerson的信息已经不再分布在不同的数据表中了,同时也没有了主从键了。

比如以前这样的查询:

1SELECT sp.FirstName, sp.LastName, sp.HireDate
2FROM SalesPerson sp
3INNER JOIN Employee e ON sp.SalesPersonID = e.EmployeeID
4INNER JOIN Contact c ON e.EmployeeID = c.ContactID
5WHERE e.SalariedFlag = 1 AND e.HireDate >= '2006-01-01'
6

现在只需写成:

1SELECT sp.FirstName, sp.LastName, sp.HireDate
2FROM SalesPeople AS sp
3WHERE sp.HireDate >= '2006-01-01'



更多关于ADO.NET Entity Framework相关的介绍, 英文好的朋友可以参阅:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/ADONET_EDM.asp
以及
http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/ADONETEnFrmOvw.asp


相关文章推荐

ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3)

[示例代码下载]之前写过一篇如何利用 EFProviderWrappers 在EF中增加日志的blog,那篇文章是基于 ModelFirst 来写的,这里在 EF 4.3 CodeFirst 上再次实...

ADO.NET Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务

本节,直接写通过代码来学习。这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕。 l          增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下...

ADO.NET Entity Framework学习笔记(1)介绍[转]

ADO.NET Entity Framework学习笔记(1)介绍[转] 概念   LINQ to Entities 一种 LINQ 技术,...
  • tereser
  • tereser
  • 2014年08月19日 15:22
  • 385

ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转]

说明  ObjectContext提供了管理数据的功能  Context操作数据   AddObject 添加实体 将实体添加到集合中, 创建实体时,状态为EntityState.Detached 当...

ADO.NET Entity Framework Extensions 简单应用

一、情景如果你的项目中有返回多结果集的存储过程。如果你的项目要和老项目中的ADO.Net共用事务。如果你要动态的创建数据库的表。但是你还是希望使用Entity Framework。那么继续往下看吧。二...

ADO.NET Entity Framework 学习初级篇2--几个重要类的介绍

本节,简单的介绍EF中的ObjectContext、ObjectQuery、ObjectStateEntry、 ObjectStateManager这个几个比较重要的类,它们都位于System....

ADO.NET Entity Framework之ObjectQuery对象

ObjectQuery数据加载方式   1. ObjectQuery 提供了一个管理[实体对像]集合  2. ObjectQuery继承System.Data.Objects.Objec...
  • educast
  • educast
  • 2012年06月19日 09:14
  • 850

ADO.net,Linq to SQL和Entity Framework性能实测分析

最近文档写了不少,导致Word和Excel的使用能力飞一般成长。考虑到项目中读写数据库的方法存在效率不高,以致影响用户体验的问题,决定测试一下Microsoft新推行的Linq和EF能不能在效率上有所...

自定义Unity对象生命周期管理集成ADO.NET Entity Framework

来源:http://blog.csdn.net/shanyou/article/details/4681355   在Unity中,从Unity 取得的实例为 Transient。如果你希望使...

EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景

1.我的环境VS2008 SP1.Entity Data Model  Wizard里选DataSource时不能选择Acess的数据库.是否目前不能建Acess的Entity Data Model....
  • educast
  • educast
  • 2012年05月22日 12:47
  • 2655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ADO.NET Entity Framework简介
举报原因:
原因补充:

(最多只允许输入30个字)