ADO.NET Entity Framework
维基百科,自由的百科全书
ADO.NET Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的物件關聯對應 (O/R Mapping) 解決方案,早期被稱為 ObjectSpace,現已經包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中發表。
ADO.NET Entity Framework 以 Entity Data Model (EDM) 為主,將資料邏輯層切分為三塊,分別為 Conceptual Schema, Mapping Schema 與 Storage Schema 三層,其上還有 Entity Client,Object Context 以及 LINQ 可以使用。
目录 |
[编辑] 背景
長久以來,程式設計師和資料庫總是保持著一種微妙的關係,在商用應用程式中,資料庫一定是不可或缺的元件,這讓程式設計師一定要為了連接與存取資料庫而去學習 SQL 指令,因此在資訊業中有很多人都在研究如何將程式設計模型和資料庫整合在一起,物件關聯對應 (Object-Relational Mapping) 的技術就是由此而生,像Hibernate或NHibernate都是這個技術下的產物,而微軟雖然有了ADO.NET這個資料存取的利器,但卻沒有像NHibernate這樣的物件對應工具,因此微軟在.NET Framework 2.0發展時期,就提出了一個ObjectSpace的概念,ObjectSpace可以讓應用程式可以用完全物件化的方法連接與存取資料庫,其技術概念與NHibernate相當類似,然而ObjectSpace工程相當大,在.NET Framework 2.0完成時仍無法全部完成,因此微軟將ObjectSpace納入下一版本的.NET Framework中,並且再加上一個設計的工具(Designer),構成了現在的 ADO.NET Entity Framework。
Entity Framework 利用了抽象化資料結構的方式,將每個資料庫物件都轉換成應用程式物件 (entity),而資料欄位都轉換為屬性 (property),關聯則轉換為結合屬性 (association),讓資料庫的 E/R 模型完全的轉成物件模型,如此讓程式設計師能用最熟悉的程式語言來呼叫存取。而在抽象化的結構之下,則是高度整合與對應結構的概念層、對應層和儲存層,以及支援 Entity Framework 的資料提供者 (provider),讓資料存取的工作得以順利與完整的進行。
- 概念層:負責向上的物件與屬性顯露與存取。
- 對應層:將上方的概念層和底下的儲存層的資料結構對應在一起。
- 儲存層:依不同資料庫與資料結構,而顯露出實體的資料結構體,和 Provider 一起,負責實際對資料庫的存取和 SQL 的產生。
[编辑] 架構
[编辑] 概念層結構
概念層結構定義了物件模型 (Object Model),讓上層的應用程式碼可以如物件導向的方式般存取資料,概念層結構是由 CSDL (Conceptual Schema Definition Language) 所撰寫[1]。
一份概念層結構定義如下所示:
<?xml version="1.0" encoding="utf-8"?> <Schema Namespace="Employees" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> <EntityContainer Name="EmployeesContext"> <EntitySet Name="Employees" EntityType="Employees.Employees" /> </EntityContainer> <EntityType Name="Employees"> <Key> <PropertyRef Name="EmployeeId" /> </Key> <Property Name="EmployeeId" Type="Guid" Nullable="false" /> <Property Name="LastName" Type="String" Nullable="false" /> <Property Name="FirstName" Type="String" Nullable="false" /> <Property Name="Email" Type="String" Nullable="false" /> </EntityType> </Schema>
[编辑] 對應層結構
對應層結構負責將上層的概念層結構以及下層的儲存體結構中的成員結合在一起,以確認資料的來源與流向。對應層結構是由 MSL (Mapping Specification Language) 所撰寫[2]。
一份對應層結構定義如下所示:
<?xml version="1.0" encoding="utf-8"?> <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> <EntityContainerMapping StorageEntityContainer="dbo" CdmEntityContainer="EmployeesContext"> <EntitySetMapping Name="Employees" StoreEntitySet="Employees" TypeName="Employees.Employees"> <ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" /> <ScalarProperty Name="LastName" ColumnName="LastName" /> <ScalarProperty Name="FirstName" ColumnName="FirstName" /> <ScalarProperty Name="Email" ColumnName="Email" /> </EntitySetMapping> </EntityContainerMapping> </Mapping>
[编辑] 儲存層結構
儲存層結構是負責與資料庫管理系統(DBMS)中的資料表做實體對應 (Physical Mapping),讓資料可以輸入正確的資料來源中,或者由正確的資料來源取出。它是由 SSDL (Storage Schema Definition Language) 所撰寫[3]。
一份儲存層結構定義如下所示:
?xml version="1.0" encoding="utf-8"?> <Schema Namespace="Employees.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> <EntityContainer Name="dbo"> <EntitySet Name="Employees" EntityType="Employees.Store.Employees" /> </EntityContainer> <EntityType Name="Employees"> <Key> <PropertyRef Name="EmployeeId" /> </Key> <Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" /> <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="FirstName" Type="nvarchar" Nullable="false" /> <Property Name="Email" Type="nvarchar" Nullable="false" /> </EntityType> </Schema>
[编辑] 用戶端支援
當定義好 Entity Data Model 的 CS/MS/SS 之後,即可以利用 ADO.NET Entity Framework 的用戶端來存取 EDM,EDM 中的資料提供者會向資料來源存取資料,再傳回用戶端。
目前 ADO.NET Entity Framework 有三種用戶端[4]:
[编辑] Entity Client
Entity Client 是 ADO.NET Entity Framework 中的原生用戶端 (Native Client),它的物件模型和 ADO.NET 的其他用戶端非常相似,一樣有 Connection, Command, DataReader 等物件,但最大的差異就是,它有自己的 SQL 指令 (Entity SQL),可以用 SQL 的方式存取 EDM,簡單的說,就是把 EDM 當成一個實體資料庫。
// Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); //Set the provider name. entityBuilder.Provider = providerName; // Set the provider-specific connection string. entityBuilder.ProviderConnectionString = providerString; // Set the Metadata location. entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl| res://*/AdventureWorksModel.ssdl| res://*/AdventureWorksModel.msl"; Console.WriteLine(entityBuilder.ToString()); using (EntityConnection conn = new EntityConnection(entityBuilder.ToString())) { conn.Open(); Console.WriteLine("Just testing the connection."); conn.Close(); }
[编辑] Object Context
由於 Entity Client 太過於制式,而且也不太符合 ORM 的精神,因此微軟在 Entity Client 的上層加上了一個供程式語言直接存取的介面,它可以把 EDM 當成物件般的存取,此介面即為 Object Context (Object Service)。
在 Object Context 中對 EDM 的任何動作,都會被自動轉換成 Entity SQL 送到 EDM 中執行。
// Get the contacts with the specified name. ObjectQuery<Contact> contactQuery = context.Contact .Where("it.LastName = @ln AND it.FirstName = @fn", new ObjectParameter("ln", lastName), new ObjectParameter("fn", firstName));
[编辑] LINQ to Entities
Object Context 將 EDM 的存取改變為一種對物件集合的存取方式,這也就讓 LINQ 有了發揮的空間,因此 LINQ to Entities 也就由此而生,簡單的說,就是利用 LINQ 來存取 EDM,讓 LINQ 的功能可以在資料庫中發揮。
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities()) { ObjectQuery<Product> products = AWEntities.Product; IQueryable<Product> productNames = from p in products select p; }
[编辑] 開發工具
目前 ADO.NET Entity Framework 的開發,在 Visual Studio 2008 中有充份的支援,在安裝 Visual Studio 2008 Service Pack 1 後,檔案範本中即會出現 ADO.NET 實體資料模型 (ADO.NET Entity Data Model) 可讓開發人員利用 Entity Model Designer 來設計 EDM,EDM 亦可由記事本或文字編輯器所編輯。
[编辑] 衍生服務
微軟特別針對了網路上各種不同的應用程式(例如 AJAX,Silverlight,Mashup 應用程式)開發了一個基於 ADO.NET Entity Framework 之上的服務,稱為 ADO.NET Data Services(專案代號為 Astoria),並與 ADO.NET Entity Framework 一起包裝在 .NET Framework 3.5 Service Pack 1 中發表。
[编辑] 支援廠商
目前已有數個資料庫廠商或元件開發商宣布要支援 ADO.NET Entity Framework[5]:
- Core Lab,支援Oracle、MySQL、PostgreSQL 與 SQLite 資料庫。
- IBM,實作 DB2 使用的 LINQ Provider。
- MySQL,發展 MySQL Server 所用的 Provider。
- Npqsql,發展 PostgreSQL 所用的 Provider。
- OpenLink Software,發展支援多種資料庫所用的 Provider。
- Phoenix Software International,發展支援 SQLite 資料庫的 Provider。
- Sybase,將支援 Anywhere 資料庫。
- VistaDB Software,將支援 VistaDB 資料庫。
- DataDirect Technologies,發展支援多種資料庫所用的 Provider。
- Firebird,支援 Firebird 資料庫。
[编辑] 參考資料
[编辑] 外部連結
- (英文) MSDN Library : ADO.NET Entity Framework
- (正体中文) 讀寫 ADO.NET Entity Framework
- (正体中文) 整合 ADO.NET Entity Framework 到應用程式中
- (正体中文) 首次接觸 ADO.NET Entity Framework
- (正体中文) ADO.NET Entity Framework 概觀
- (英文) Recent ADO.NET Entity Framework provider news - Demos and downloads
|
|
|
|---|---|
| 平台 | Windows Azure |
| 服務 | SQL Services · Live Services · .NET Services · SharePoint Services · Microsoft Dynamics CRM Services |
| 應用 | Windows Live · Office Live · Exchange Online · SharePoint Online · Dynamics CRM Online |
| 技術 | Project "Velocity" · ADO.NET Data Services · ADO.NET Entity Framework · WCF · WF |
|
|
|||||
|---|---|---|---|---|---|
| 架構 | 基礎類別庫 · 共同語言執行期元件 · 程式碼存取安全性 · 組件 · 中介資料 · COM互通性 | ||||
| 共同語言基礎架構 | 共同語言基礎架構(CLI) · 共同型別系統 · 共同中介語言 · 虛擬執行系統 | ||||
| CLI 支援語言 |
|
||||
| 應用平台 | WPF · WCF · WF (WWF) | ||||
| 元件 | ADO.NET (Entity Framework · Data Services) · ASP.NET (AJAX · MVC · Dynamic Data) · Remoting · LINQ · Windows CardSpace · Windows Forms · XAML · ClickOnce · Dynamic Language Runtime · Parallel FX Library (PLINQ · TPL) | ||||
| 其他平台實作 | Mono · Compact Framework · Micro Framework · Portable.NET · Silverlight · SSCLI | ||||
| 比較 | C#与Java · C#与Visual Basic .NET · Java与.NET平台 | ||||
| 即將推出 | "Acropolis" · "Jasper" | ||||
| 1 這些語言都被包含在Visual Studio. 2 被多數使用者使用,且非教學或研究型的語言。 |
|||||

