ADO.NET Entity Framework簡介
下一代的ADO.NET的目標是要解決關系數據模型和實際應用程序需要模型之間的鴻溝,那么它是怎么做到的呢?
我們都知道,建立在關系數據庫基礎之上的應用程序經常需要在不同的表之間做復雜的join操作來取得相關的數據。
比如下面的例子:
[圖1]
這是一個普通的關系型數據庫。這個結構主要描述了雇員的基本信息和雇員的銷售情況。
假如我們想取得所有在2006年1月1日招聘過來的全職員工的姓名和職務信息,那么就需要寫如下的sql查詢語句:

2

3

4

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的信息已經不再分布在不同的數據表中了,同時也沒有了主從鍵了。
比如以前這樣的查詢:

2

3

4

5

6

現在只需寫成:

2

3

更多關于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