您的位置:知识库 » .NET技术

ADO.NET Entity Framework简介

作者: Ring  发布时间: 2008-08-31 11:09  阅读: 16957 次  推荐: 0   原文链接   [收藏]  

下一代的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

0
0

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻