Entity Framework
Entity Framework是未來微軟所主推的資料存取技術,有別於傳統的ADO .NET是以資料集(RecordSet)的角度來操作資料,而Entity Framework則是以物件(Object)的角度來操作資料。
筆者認為學習一樣技術,不要去盲目追求其"形",而是要瞭解其精髓,接下來再去瞭解操作面或是方法面就是容易的許多;底下我們先分析各種資料存取觀點的差異性。
RecordSet
RecordSet的資料存取觀念是從資料庫衍生而來的,資料庫是以表格為基礎,並用SQL語法加以查詢回來也是用表格的方式呈現;資料庫的設計基礎是用來儲存大量的資料,並且方便存取這些資料,而並不是以使用者的觀點來進行設計。
運用RecordSet來操作資料的優點是熟悉資料庫的概念可以很快上好使用,但是使用RecordSet的問題是使用者需要對於資料庫的
欄位相當熟悉才可操作,對於資料的存取會限制在資料庫的概念當中,假設資料來源不是來自於資料庫,那麼運用RecordSet就會無法處理。
RecordSet是運用索引的方式來存取資料值,所以當資料庫變動時,使用者也要相當清楚資料庫的結構變動才行。
XML
XML是近幾年來相當熱的資料格式,其主要的優點在於跨平台,並且有豐富的資料結構,可以表達多層次的資料;然而要運用XML來操作資料,會遇到一個問題就是對於資料的介面不是很清楚,當資料的結構改變時,使用者也必需被通知到才能加以改寫相關的程式。
Object
運用物件來存取資料的好處是可以提供高度抽象化的觀點,而不需要綁定在特定的資料存取方式,例如資料庫,雖然資料庫是目前主流儲存資料的方式;另外運用物件的好處是,物件在使用前要先定義或是宣告,所以會有強型別的特性。
對於設計資料存放結構者,其實會希望資料存取模型越彈性越好,以能夠應付現在及未來的需求;但是對於使用資料模型的人而言,會希望很清楚知道每種資料的概念為何,有哪些詳細的欄位,每個欄位其名稱又為何。
Entity Framework觀念
在瞭解了XML、Object及RecordSet對於資料存取的觀點後,再來瞭解Entity
Framework的觀念就會相當容易;Entity
Framework主要的目前在於提供以物件觀點為基礎的資料存取方式;以物件為觀點的資料存取方式最大的優點在於可以先不就資料"實際儲存方式"來進行
考量,而是單就"我需要什麼樣的資料"這種角度來進行考量;而不會有受限於實體儲存方式的包袱。
Entity Framework希望讓開發者能夠專心於"我需要什麼樣的資料"這件事情上面,而其中實際儲存及查詢繁瑣的細節則交由Entity Framework來處理。
概念層結構
概念層結構定義了物件模型 (Object Model),讓上層的應用程式碼可以如物件導向的方式般存取資料,概念層結構是由 CSDL (Conceptual Schema Definition Language) 所撰寫。 <?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) 所撰寫。
<?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) 所撰寫。 <?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> |
|