Entity Framework 一覽
EF集合了一系列以方便使用數據的應用程序的開發。和微軟之前的數據訪問技術不一樣,EF和Visual Studio一起,構成了一個全面的、基於模型的生態系統,你可以用它來開發一些范圍廣泛的數據導向的應用程序。 比如用Asp.net和Sliverlight開發桌面程序、服務器端程序、Internet程序,用WCF的分布式多機程序等。
Model
EF其實所做的所有工作都是為了構建模型。模型在EF中代表的意義不是憑空冒出而是逐漸演進的。在EF中有很多地方都是受到以往技術和模式的遺傳影響。比如實體關系圖和長時間都在用的概念-邏輯-物理分層設計的方法。
EF用Entity Data Model(EDM)來標志模型。EDM是一種用來定義程序中用到的數據的正式結構,它定義了數據類型、明確哪種類型的關聯是允許的、模型支持的schemas以及在不同schemas中的映射。(schemas不好翻譯,數據庫中術語,可以叫模式,db->schemas->tables)。程序你建的模型就是對應着EDM中的條目來的,這有點像EDM就是一個Class(類),而模型都是滿足它的Instance(實例),但只是有點像而已,它們是不一樣的,EDM中的是定義模型的結構。
好吧,現在牽扯出來了很多術語了。首先,一個Model(模型)由三層組成:概念層、存儲層和映射層。每一層的語法都是在一個XML文件中表示的,schema也在這個XML中有定義。為了方便,這三層的三個不同的XML文件都綁在了一起,構成了一個后綴名為.edmx的文件。
概念層模型,是開發人員實際能接觸的,這一層中已經沒有物理存儲層的跡象,在CSDL(Conceptual Schema Definition Language)中定義。VS提供了一個功能齊全的設計界面,你可以直接在概念層上操作實體類型和各種關系。概念層模型是在CSDL中定義的。
任何有用的程序都要有數據的持久化操作,在存儲層我們定義數據的存儲。它包括了表、列和數據類型的定義,這在SSDL(Store Schema Definition Language)中有記錄。
在概念層和存儲層的映射層就是把這兩層各自的模型映射在一起。比如這個類中的屬性怎么和數據庫中的那個字段關聯起來。這些細節在MSL(Mapping Specification Language)中定義。
一些術語
EntityType(實體類型) ,它是一個類,定義了一個新的類型。它的實例叫做Entity,但經常都被統一叫做了Entity。Entity Type中定義了一些屬性,包括有標量屬性(Scalar)、復雜屬性(Complex type)和導航屬性(navigation)。如圖1-1,定義了兩個EntityType:Employee和Task。它們之間的關系是一對多的。
圖1-1
Association(關聯) 也如上圖,兩個實體類型之間的關系叫做 Association 。有一對多,多對一,多對多和自身關聯。每一個EntityType都是一個EntityKey屬性,相當於主鍵標識,通常是由下層數據庫中的實際主鍵決定的。
EntitySet (實體集) 實體集就是一些EntityType實例的集合,或者也包含它的派生類型。在多數情況下,給定EntityType的實例們都是在同一個實體集里的,但也有例外,叫MEST(Multiple EntitySets per Type),這個以后我們會講到一個例子。
ComplexType (復雜類型)是相關屬性的一個集合.復雜類型不像實體類型一樣有一個主鍵標識,它更像是把一堆相關的屬性組合到一起,形成一個新的屬性。圖1-2就是一個很好的例子。Customer有正常的標量屬性(Id,Name,Phone),但同時又有兩個復雜屬性BillingAddress和ShipToAddress,這兩個復雜屬性都屬於同一個Adrress的復雜類型。Address類型中包含了各種信息,但沒有一個可以說是主鍵的,它們只是一對相關屬性的集合。
圖1-2
Navigation properties(導航屬性)這個是在數據庫中有直接外鍵關系的,EF可以通過它從一張表導航鏈接到另外一張表。