EF
來源:程序員人生 發布時間:2015-03-21 09:13:45 閱讀次數:4591次
EF作用
ADO.NET的連接層和斷開連接層提供了1個架構,可以通過連接、命令、數據讀取器、數據適配器和dataset對象來進行查詢、插入、更新和刪除數據等操作。雖然這是1個10分優秀的架構,但他還是會迫使我們以1種與物理
數據庫結構緊耦合的方式來處理數據。例如在使用連接層時,我們通常在數據讀取器中指定列名來便利每天記錄。而如果使用斷開連接層,則將會對dataset容器中的datatable對象的行列集合進行遍歷
如果在斷開連接層中使用強類型的dataset或數據適配器,那末帶來的編程方面的抽象性是很有幫助的。首先,強類型的dataset使用類的屬性來表示表數據。其次,強類型的表適配器支持封裝了構造底層SQL語句的方法。
相比更新
數據庫時使用1些SQL查詢來查找、更新,再將其發送回
數據庫進行處理,使用ef可以簡單地修改對象的屬性,并保存其狀態。ef在運行時將自動更新
數據庫。
實體的作用:
前面說到強類型類成為實體。實體是將無力
數據庫映照到業務領域的概念模型。這類模型的正式名稱為實體
數據庫模型(EDM)。它是1組映照到無力
數據庫的客戶端類,但是這些實體沒有必要與
數據庫架構的命名約定完全1致。你完全可以根據需要調劑實體類,ef運行時將把這些唯1的名字映照到正確的
數據庫架構。
(大多數情況,客戶端實體類的名稱都與關系型
數據庫表名相同。但你總是可以修改它的名稱使其與業務環境更符合)
EF基礎:
EF API 和其他的ADO.NET 交互方式1樣,ef使用1個ado.net 數據提供程序來與數據存儲進行交互。所不同的是,在恩你個狗與ef api 交互之前,必須更新數據提供程序使其支持新的服務。除微軟SQLserver數據提供程序增加了必要的內容之外,system.data .entity .dll 程序集還包括了各種命名空間來解釋EF服務本身。EF API的兩個關鍵部份為
對象服務 和 實體客戶端。
對象服務的作用:
對象服務是ef的1部份,他在代碼中對客戶端進行控制。例如,對象服務跟蹤你會實體的更改、管理實體間的關系并提供將更改保存到
數據庫的方法,和用xml或2進制序列化服務隊實體狀態進行持久化的方法。
就編程而言,對象服務層對所有擴大entityObject積累的類進行管理
實體客戶真個作用:
EF API 的另外一個主要部份是實體客戶端層,她使用基本的ado.net 數據提供程序來建立
數據庫連接、基礎實體狀態和linq 查詢生成sql語句、將
數據庫數據映照到實體,和處理其他其他在不使用ef經常見的細節問題。
*.edmx文件的作用
為了使entityframework api能夠將實體類數據正確映照到
數據庫表數據,你需要定義適當的映照邏輯。在所有的數據模型驅動的系統中,實體、真實的
數據庫和映照層都會被劃分為3個相干的部份:概念模型、邏輯模型和物理模型。
概念模型:實體和她們呢之間的關系
邏輯模型:將實體和關系(通過外鍵束縛)映照到表
物理模型:通過指定的存儲細節(如表架構、表分割和索引)來表示特定的數據引擎的能力。
在ef中,這3層均寄存在基于xml格式的文件里。當使用vs集成的ef設計器時,會得到1個以*.edmx 為擴大名的文件(EDM為entity data model)。該文件包括實體、物理數據庫的xml描寫,并且介紹了如何在概念模型和物理模型之間映照這些信息。
當使用visual studio編譯基于EF項目時,*.edmx 文件將生成3個獨立的文件:用于概念模型數據的*.csdl 、用于物理模型的*.ssdl 和用于映照層的*.msl .然后這3個基于xml的文件將以2進制資源的情勢綁定到利用程序中。編譯以后,.NET 程序集中將包括代碼庫中所調用的ef
api的所有必要的數據。
ObjectContext和ObjectSet <T>類的作用
ef的最后1個難點是objectContext類,它是system.Data .Objects 命名空間的1員。在生成*.emdx 文件時,你將得到映照到數據庫表的實體類和1個繼承自ObjectContext的類。該類通經常使用于對象服務與實體客戶端之間的交互。
ObjectContext為自雷提供了大量的核心服務,包括保存所有更新的功能(用于
數據庫更新)、調劑連接字符床、刪除對象、調用存儲進程、處理其他底層細節。
ObjectContext的派生類作為1個容器,管理那些存儲在ObjectSet<T>集合中的實體對象。
匯總
上圖創建的場景:對上下文的實體編寫了1個Linq查詢,該查詢被傳遞給對象服務,對象服務將linq命令轉換為實體客戶端可以理解的樹。然后,實體客戶端將樹轉化為ADO.NET提供程序的SQL語句。提供程序返回1個數據讀取器(如1個D不DataReader的派生對象),客戶端服務使用該讀取器(EntityDataReader)將數據傳入對象服務。終究C#代碼庫所得到的是實體
數據庫的枚舉(IEnumberable<T>)。

還有1種情況,如果你的C#代碼庫希望對客戶端服務創建的發送到
數據庫的SQL語句進行更多地控制,你可以編寫C#代碼直接將Entity SQL傳遞給實體客戶端或對象服務。終究得到的也是1個IEnumberable<T>。
這兩種情況下,你都必須使得客戶端服務理解*.edmx文件中的xml數據,即如何將
數據庫院子映照到實體。最后要記住的是,客戶端(C#代碼庫)還可使用EntityDataReader直接從實體客戶端獲得數據。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈