1. 程式人生 > >NHibernate與EF(Entity Framework)的區別

NHibernate與EF(Entity Framework)的區別

概述

長久以來,程式設計師和資料庫總是保持著一種微妙的關係,在商用應用程式中,資料庫一定是不可或缺的元件,這讓程式設計師一定要為了連線與訪問資料庫而去學習 SQL 指令,至少對於我而言,我覺得這是一個很不爽的事情。因此在資訊業中有很多人都在研究如何將程式設計模型和資料庫整合在一起,物件關係對應 (Object-Relational Mapping) 的技術就是由此而生,像Hibernate或NHibernate都是這個技術下的產物,而微軟官方一直沒有推出類似的框架,依舊依靠ADO.NET這個傳統的資料訪問工具。估計微軟也聽到了來自程式設計師的抱怨,於是從一個ObjectSpace(ObjectSpace最早在2005年?被提出,可以讓應用程式可以用完全物件化的方法連線與訪問資料庫,其技術概念與NHibernate相當類似)的概念最後在2008年隨.net framework 3.5 SP1釋出了ADO.NET Entity Framework,一個附帶有圖形化設計器的面向實體資料庫訪問框架。

如圖:

NHibernate

NHibernate 是一個面向.NET 環境的物件/關係資料庫對映工具。物件關係對映(O/R Mapping,Object Relational Mapping)表示一種技術,用來把物件模型表示的物件對映到基於SQL 的關係模型資料結構中去。NHibernate是基於ms.net的O/R Mapping持久框架,它從基於Java的Hibernate專案移植而來。O/R Mapping就是把物件到對映關係資料庫的記錄,簡單的說就是能實現把一個物件儲存為資料表中的一條記錄和由一條記錄建立一個相應的物件,資料表中的資料就是物件的屬性。

NHibernate不僅僅管理.NET 類到資料庫表的對映(包括.NET 資料型別到SQL 資料型別的對映),還提供資料查詢和獲取資料的方法,大幅度減少我們開發時人工使用SQL和ADO.NET處理資料的時間。NHibernate的目標是對於開發者通常的資料持久化相關的程式設計任務,解放其中的95%。並請記住NHibernate作為資料庫訪問層,是與你的程式緊密整合的。


那麼為什麼要使用O/R Mapping?它與傳統的DataSet/DataTable又有什麼不同了?


首先是設計上的不同,當使用O/R Mapping時,更多的是從物件的角度來設計程式,而把資料(物件的屬性)儲存的細節放在後面, 可以完全採用面向物件(OO)的方式來設計,而在使用DataSet/DataTable時,它只是存放資料的物件,看起來更像一個數據表,不能直觀的表達業務概念。

NHibernate架構

NHibernate體系結構非常抽象的概覽

展示了NHibernate在資料庫和應用程式之間提供了一個持久層。

第一幅圖好像非常簡單?其實NHibernate是比較複雜的。我們瞭解兩種極端情況,輕量級和重量級架構。再來第二幅圖:輕量級體系,應用程式自己提供ADO.NET連線,並且自行管理事務。

最後一張圖:重量級體系:所有的底層ADO.NET API都被抽象了。

Hibernate優點:

(1)物件/關係資料庫對映(Basic O/R Mapping)

它使用時只需要操縱物件,使開發更物件化,拋棄了資料庫中心的思想,完全的面向物件思想。

(2)透明持久化(Persistent)

帶有持久化狀態的、具有業務功能的單執行緒物件,此物件生存期很短。這些物件可能是普通的JavaBeans/POJO,這個物件沒有實現第三方框架或者介面,唯一特殊的是他們正與(僅僅一個)Session相關聯。一旦這個Session被關閉,這些物件就會脫離持久化狀態,這樣就可被應用程式的任何層自由使用。(例如,用作跟表示層打交道的資料傳輸物件。)           

(3)事務Transaction (org.Hibernate.Transaction)

應用程式用來指定原子操作單元範圍的物件,它是單執行緒的,生命週期很短。它通過抽象將應用從底層具體的JDBC、JTA以及CORBA事務隔離開。某些情況下,一個Session之內可能包含多個Transaction物件。儘管是否使用該物件是可選的,但無論是使用底層的API還是使用Transaction物件,事務邊界的開啟與關閉是必不可少的。

(4)它沒有侵入性,即所謂的輕量級框架。

(5)移植性會很好。

(6)快取機制。提供一級快取和二級快取。

(7)簡潔的HQL程式設計。

Hibernate缺點:

(1)Hibernate在批量資料處理的時候是有弱勢。

(2)針對某一物件(單個物件)簡單的查\改\刪\增,不是批量修改、刪除,適合用Hibernate;而對於批量修改、刪除,不適合用Hibernate,這也是OR框架的弱點;要使用資料庫的特定優化機制的時候,不適合用Hibernate。

Entity Framework

在.Net Framework SP1微軟包含一個實體框架(Entity Framework),此框架可以理解成微軟的一個ORM產品。用於支援開發人員通過對概念性應用程式模型程式設計(而不是直接對關係儲存架構程式設計)來建立資料訪問應用程式。目標是降低面向資料的應用程式所需的程式碼量並減輕維護工作。

Entity Framework 應用程式有以下優點:

  • 應用程式可以通過更加以應用程式為中心的概念性模型(包括具有繼承性、複雜成員和關係的型別)來工作。
  • 應用程式不再對特定的資料引擎或儲存架構具有硬編碼依賴性。
  • 可以在不更改應用程式程式碼的情況下更改概念性模型與特定於儲存的架構之間的對映。
  • 開發人員可以使用可對映到各種儲存架構(可能在不同的資料庫管理系統中實現)的一致的應用程式物件模型。
  • 多個概念性模型可以對映到同一個儲存架構。
  • 語言整合查詢支援可為查詢提供針對概念性模型的編譯時語法驗證。

實體框架Entity Framework 是 ADO.NET 中的一組支援開發面向資料的軟體應用程式的技術。在EF中的實體資料模型(EDM)由以下三種模型和具有相應副檔名的對映檔案進行定義。

  • 概念架構定義語言檔案 (.csdl) -- 定義概念模型。
  • 儲存架構定義語言檔案 (.ssdl) -- 定義儲存模型(又稱邏輯模型)。
  • 對映規範語言檔案 (.msl) -- 定義儲存模型與概念模型之間的對映。

實體框架 使用這些基於 XML 的模型和對映檔案將對概念模型中的實體和關係的建立、讀取、更新和刪除操作轉換為資料來源中的等效操作。EDM 甚至支援將概念模型中的實體對映到資料來源中的儲存過程。它提供以下方式用於查詢 EDM 並返回物件:

  • LINQ to Entities -- 提供語言整合查詢 (LINQ) 支援用於查詢在概念模型中定義的實體型別。
  • Entity SQL -- 與儲存無關的 SQL 方言,直接使用概念模型中的實體並支援諸如繼承和關係等 EDM 功能。
  • 查詢生成器方法 --可以使用 LINQ 風格的查詢方法構造 Entity SQL 查詢。

下圖演示用於訪問資料的實體框架體系結構:

我認為的一些缺點:

·Edmx包含了所有物件的csdl,ssdl,msl檔案,過於龐大,如果要手動修改這個檔案,一不小心,眼睛看花了,就改錯了。(和資料集一樣的毛病)。

·目前EF支援表、試圖、儲存過程,其他的物件不支援,而且對使用儲存過程有很多限制(目前有EFExtension提供了更多物件的支援)。

·除了MS SQL Server可直接提供這種視覺化的設計介面外,其他的資料庫目前還沒有提供視覺化設計介面(但可以自己來實現,後面介紹)。

·效能問題。(網上看到有說比ADO.Net慢700百,又有人說比ADO.net快的,具體情況我還沒測試過, 但我覺得像這個些型別的框架,效能肯定是比上原生態的ADO.net慢)

案例:

Entity Framework 利用了抽象化資料結構的方式,將每個資料庫物件都轉換成應用程式物件 (entity),而資料欄位都轉換為屬性 (property),關係則轉換為結合屬性 (association),讓資料庫的 E/R 模型完全的轉成物件模型,如此讓程式設計師能用最熟悉的程式語言來呼叫訪問。而在抽象化的結構之下,則是高度整合與對應結構的概念層、對應層和儲存層,以及支援 Entity Framework 的資料提供者 (provider),讓資料訪問的工作得以順利與完整的進行。ADO.NET Entity Framework 以 Entity Data Model (EDM) 為主,將資料邏輯層切分為三塊,分別為 Conceptual Schema, Mapping Schema 與 Storage Schema 三層:
  (1) 概念層:負責向上的物件與屬性顯露與訪問,讓上層的應用程式碼可以如面向物件的方式般訪問資料。這部分由設計器自動生成,表現在一系列的類。
  (2) 對應層:將上方的概念層和底下的儲存層的資料結構對應在一起,負責將上層的概念層結構以及下層的儲存體結構中的成員結合在一起,以確認資料的來源與流向。這部分由描述語言實現,可以自由修改。
  (3) 儲存層:依不同資料庫與資料結構,而顯露出實體的資料結構體,負責與資料庫管理系統 (DBMS) 中的資料表做實體對應 (Physical Mapping),讓資料可以輸入正確的資料來源中,或者由正確的資料來源取出。 

對於訪問者(上層的邏輯)而言,可以使用三種方式訪問EDM:Entity Client,Object Context 以及LINQ 

1. Entity Client(資料庫操作訪問方式)

Entity Client是 ADO.NET Entity Framework 中的本地使用者端 (Native Client),它的物件模型和 ADO.NET 的其他使用者端非常相似,一樣有 Connection, Command, DataReader 等物件,但最大的差異就是,它有自己的 SQL 指令 (Entity SQL),可以用 SQL 的方式訪問 EDM,簡單的說,就是把 EDM 當成一個實體資料庫。 

複製程式碼EntityConnectionStringBuilder entityBuilder =new EntityConnectionStringBuilder(); entityBuilder.Provider = providerName; entityBuilder.ProviderConnectionString = providerString; using (EntityConnection conn =new EntityConnection(entityBuilder.ToString())) { conn.Open(); EntityCommand comm =new EntityCommand("SELECT * FROM Student", conn); EntityDataReader reader = comm.ExecuteReader(); conn.Close(); }複製程式碼

2. Object Context(物件操作訪問方式) 

由於 Entity Client 太過於制式,而且也不太符合 ORM 的精神,因此微軟在 Entity Client 的上層加上了一個供程式語言直接訪問的介面,它可以把 EDM 當成物件般的訪問,此介面即為 Object Context (Object Service),在 Object Context 中對 EDM 的任何動作,都會被自動轉換成 Entity SQL 送到 EDM 中執行。我個人比較傾向於使用這種方式。 

DBForEntityEntities db =new DBForEntityEntities(); ObjectQuery<Student> que = db.Student.Where("[email protected]", new ObjectParameter("P1", "N1")); foreach (Student st in que) { //TO DO SOMETHING }

3. LINQ(LINQ操作的訪問方式) 

Object Context 將 EDM 的訪問改變為一種對物件集合的訪問方式,這也就讓 LINQ 有了發揮的空間,因此 LINQ to Entities 也就由此而生,簡單的說,就是利用 LINQ 來訪問 EDM,讓 LINQ 的功能可以在資料庫中發揮。 

DBForEntityEntities db =new DBForEntityEntities(); ObjectQuery<Student> students = db.Student; IQueryable<Student> Que = from p in students select p;

相關推薦

NHibernateEFEntity Framework區別

概述長久以來,程式設計師和資料庫總是保持著一種微妙的關係,在商用應用程式中,資料庫一定是不可或缺的元件,這讓程式設計師一定要為了連線與訪問資料庫而去學習 SQL 指令,至少對於我而言,我覺得這是一個很不爽的事情。因此在資訊業中有很多人都在研究如何將程式設計模型和資料庫整合在一

C#:實體框架EFentity framework

本文來自:http://www.cnblogs.com/xuf22/articles/5513283.html 一、什麼是Entity Framework     微軟官方提供的ORM工具,ORM讓開發人員節省資料庫訪問的程式碼時間,將更多的時間放到業務邏輯層程式碼上。EF提供變更跟蹤

關聯表查詢更新Entity Framework

AppBox 是基於 FineUI 的通用許可權管理框架,包括使用者管理、職稱管理、部門管理、角色管理、角色許可權管理等模組。 關聯表的查詢操作 使用 Include 方法,我們可以在一次資料庫查詢中將關聯表的資料一併取出。 比如查詢線上使用者列表頁面,需要在前端顯示關聯的使用者資訊,如下所

ASP.NET網站開發--實體框架EFEntity Framework

1、什麼是Entity Framework! 它就是微軟提供的ORM工具,ORM讓開發人員節省訪問資料庫的時間,將更多的時間放在業務邏輯程式碼層中,EF提供變更追蹤,唯一性約束,惰性載入,查詢事物等!開發人員使用Linq語言對資料庫操作如同操作Object一樣省事。 2、

AnyAll的用法Entity Framework

AppBox 是基於 FineUI 的通用許可權管理框架,包括使用者管理、職稱管理、部門管理、角色管理、角色許可權管理等模組。 屬於某個角色的使用者列表(Any的用法) 使用Subsonic,我們有兩種方法獲取屬於某個角色的使用者列表,分別是表關聯和子查詢。 Subsonic的表關聯實現:

【轉】在使用實體框架Entity Framework的應用中加入審計信息Audit trail跟蹤數據的變動

要求 date ted hang ng- tar () eat code 在一些比較重要的業務系統中,通常會要求系統跟蹤數據記錄的變動情況。系統要記錄什麽時間,什麽人,對那些信息進行了變動。 比較簡單的實現方式是在每個表中加入兩個字段CreatedBy和CreatedA

Java8集合中的Lambda表示式 ------LambdaJ集合操作區別開來

Lambdas表示式是Java 8的主題,在Java平臺上我們期待了很久。但是,如果如果我們不在集合中使用它的話,就損失了很大價值。把現有介面遷移成為lambda風格介面的問題已經通過default methods,也就是defender methods解決了。在這篇文章裡面我們來看一看Java集合

Attach陷阱Entity Framework

AppBox 是基於 FineUI 的通用許可權管理框架,包括使用者管理、職稱管理、部門管理、角色管理、角色許可權管理等模組。 Attach方法 前面我們已經多次使用Attach方法,上一次使用Attach方法修改使用者所屬部門的程式碼如下所示: if (String.IsNullOrEmp

如何向OrderBy傳遞字串引數Entity Framework

AppBox 是基於 FineUI 的通用許可權管理框架,包括使用者管理、職稱管理、部門管理、角色管理、角色許可權管理等模組。 Entity Framework提供的排序功能  再來回顧一下上篇文章,載入使用者列表並進行排序資料庫分頁的程式碼: var q = DB.Users.Incl

C#綜合揭祕——利用泛型反射更新實體ADO.NET Entity Framework

自從ADO.NET Entity Framework面世以來,受到大家的熱捧,它封裝了大量程式碼生成的工具,使用者只需要建立好實體之間的關係,系統就是會為使用者自動成功了Add、Delete、CreateObject、Attach、ToList......等等方法,這些方法

jquery中的bind()、live()的區別使用事件處理

綁定 HA 我們 doc dso 目標 code span ive 原文:jquery中的bind()、live()的區別與使用(事件處理)使用jquery有一段時間了,剛開始看別人的源代碼的時候對事件的綁定方法有疑惑。比如: var btn=$("#button")

【領卓教育】Linux--靜態庫動態庫共享庫 區別、製作和使用

1.概念和區別      靜態庫 :(1)libxxx.a ,程式在編譯時,將庫編譯 進可執行程式中!                     &nbs

localStorage本地儲存sessionStorage會話儲存區別方法

localStorage生命週期是永久,使用者除非在瀏覽器上刪除localStorage的資訊,否則這些資訊將永遠存在於瀏覽器中。存放資料大小為一般為5MB, 而且它僅在客戶端(即瀏覽器)中儲存,不參與和伺服器的通訊。 sessionStorage僅在當前會話

CWndHWND的區別聯絡相互轉換完全解析

區別            首先,從這兩個單詞的第一個字母即可知道兩者之間的差別。熟悉MFC的人都知道在MFC中,類基本上都是以C開頭的,這是一種規則約定,目的就是讓人一看就知道它是一個類!           因此,CWnd第一個字母C指的是class的意思,即CWnd是

localStorage本地儲存sessionStorage會話儲存區別

localStorage生命週期是永久,這意味著除非使用者顯示在瀏覽器提供的UI上清除localStorage資訊,否則這些資訊將永遠存在。存放資料大小為一般為5MB,而且它僅在客戶端(即瀏覽器)中儲存,不參與和伺服器的通訊。sessionStorage僅在當前會話下有效,關

Servlet API中forward()轉發 redirect()重定向區別

forward(轉發),僅是容器中控制權的轉向,在客戶端瀏覽器位址列中不會顯示出轉向後的地址; forward(轉發)是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,

網站分頁功能的實現Entity Framework和ADO.NET兩種綜述

專案中用到了分頁,上次是用的是Entity Framework,這次用ADO.NET,都是老師講的,有必要總結一下,加深下記憶。 一、Entity Framework中完成分頁 老師就講了一種,在從資料庫倒序查詢到想要的list後,在對應的使用者控制元件的.cs檔案中用了兩

淺談:Filter過濾器Interceptor攔截器和Spring AOP的區別

Filter過濾器:攔截web訪問url地址。 Interceptor攔截器:攔截以 .action結尾的url,攔截Action的訪問。 Spring AOP攔截器:只能攔截Spring管理Bean

Hibernate中實體型別Entity Type值型別Value Type的概念分析

Hibernate中的實體型別和值型別,大家在實際應用中都有一個大致的概念,但是如何更明確的給他們下一個合適的定義呢? 我們需要從Hibernate看待各種物件出發。 物件內有用於標識用的屬性(一般都

淺談UML中的聚合組合兩者之間的區別

publicclass Goose  {      public Wings wings;      public Goose()      {          wings=new Wings();      }  }   聚合關係的類裡含有另一個類作為引數 雁群類(GooseGroup)的建構函