1. 程式人生 > >ado.net EF與ado.net區別比較、在EF中使用執行sql語句

ado.net EF與ado.net區別比較、在EF中使用執行sql語句

ado.net EF作為微軟的一個ORM框架,通過實體、關係型資料庫表之間的對映,使開發人員可以通過操作表實體而間接的操作資料庫,大大的提高了開發效率。

這樣一來,.net平臺下,我們與底層資料庫的互動就有兩種選擇了(這句話說得不是很準確,微軟.net 框架下還是有其他的ORM框架的,,如Nhibernate):ado.net EF、ado.net 。

你可能以為我上面的內容寫錯了,ado.net EF 、ado.net 兩者怎麼都帶有一個ado.net呢?

OK,如果你有這樣的疑問的話,那麼我們就有必要來了解一下.net的一些基本知識了

(1).net: 最核心的基礎平臺(可以看做執行環境和巨多類庫),僅次於作業系統

(2)asp.net: .net平臺下進行網站開發的框架
(3)asp.net MVC:asp.net 框架下開發網頁的一種框架
(4)ado.net: .net平臺下訪問資料庫的框架,他提供了一些列的訪問資料庫的類庫
(5)ado.net EF: ado.net框架下訪問資料庫的最新最強大的ORM
(6)ORM: 把資料庫對映為實體類的技術
(7)NHibemate: .net平臺內訪問資料庫的一種可選ORM,從Java轉換而來

以上僅僅是個人見解,不代表官方說法。

上面只是對ado.net 和ado.net EF兩者進行了簡單瞭解,下面我們再對兩者進行一個具體的比較學習

(1)ado.net 做為原裝的直接跟資料庫打交道,直接操作資料庫,沒有進行額外的封裝。比如我們可以直接執行sql語句,直接呼叫儲存過程。直接操作DataSet資料集等等資料。
(2)EF 是ORM思想的付諸於實踐,它對ado.net進行了封裝,對資料表進行了對映處理,以物件的形式展現在開發人員面前。開發人員可以利用Linq語句的優勢來執行增、改、查。但是最終的操作都是要轉換成SQL語句來執行。比如:

  1. From a in Context.Student  
  2. Where a.id =1  
  3. Select a;  
 真正執行的時候會轉換成 SQL " Select * from Student Where id=1"。

 EF讓我們可以用面向物件的思想來編寫程式,把注意力集中在系統中的業務環節。但是由於他要進行一次SQL語句的轉換,所以相對於原始的ADO.NET來說,EF由於進行了封裝,所以效能相對ADO.NET來說差一點點。不過EF也在不斷的優化和改進中。 當然,EF也可以直接執行SQL語句和儲存過程。有人會問,那為什麼不直接執行SQL語句呢,回答是,直接執行的話要EF有什麼用呢,EF就是在推行以面向物件程式設計的思想來處理業務。

OK,上面對兩者進行了簡單的比較,既然微軟對ado.net 進行封裝推出EF,那說明EF相對於原始的ado.net還是有優勢的呢,那具體有哪些呢?

EF相對於ado.net 的優點
(1)開發效率高,開發人員完全可以根據面向物件的思維進行軟體的開發
(2)可以使用三種設計模式中的ModelFirst來設計資料庫,而且比較直觀
(3)可以跨資料庫,只需要在配置檔案中修改連線字串
(4)與vs結合的比較好

缺點:效能上趕不上原生的ado.net (因為他中間還有一個生成sql指令碼的過程)

上面的缺點也暴露了一個問題:ado.net EF替代ado.net 。

那有沒有折中一點的方案,兩者都使用呢?

答案是肯定的,我們可以在EF中使用sql語句和儲存過程。那具體如何使用?

不要急,下面我們就一起來學習。

在 EF第一個版本(.NET 3.5 SP1)中,我們只能通過將ObjectContext.Connection轉換為EntityConnection,再把 EntityConnection.StoreConnection轉換為SqlConnection。有了這個SqlConnection,我們再建立 SqlCommand便能順利執行SQL命令了。(個人覺得其實很煩,呵呵)
例如:

  1. EntityConnection entityConnection = (EntityConnection)ctx.Connection;  
  2.  DbConnection storeConnection = entityConnection.StoreConnection;  
  3.  DbCommand cmd = storeConnection.CreateCommand();  
  4.  cmd.CommandType = System.Data.CommandType.StoredProcedure;  
  5. cmd.CommandText = "[PRO_USER_DIGITALCARD_CHECK]";  
  6. //。。。。。。。   

在EF4(.NET 4)中,我們有了全新的API:ObjectContext.ExecuteStoreCommand(...)和 ObjectContext.ExecuteStoreQuery<T>(...)。從函式名不難知道前者是為了執行某一併無返回集的SQL 命令,例如UPDATE,DELETE操作;後者是執行某一個查詢,並可以將返回集轉換為某一物件。
  1. using (FlowersPlatformEntities db = new FlowersPlatformEntities())  
  2.  {  
  3.      string selectSql = "select * from Flower";  
  4.      ObjectResult<Flower> result = db.ExecuteStoreQuery<Flower>(selectSql, null);  
  5.      foreach (var item in result)  
  6.      {  
  7.          //遍歷查詢結果
  8.      }  
  9.      string insertSql = "insert into dbo.Flower values('月季','月季很好看。。。。。。')";  
  10.      int res = db.ExecuteStoreCommand(insertSql, null);  
  11.      if (res > 0)  
  12.      {  
  13.          //插入成功
  14.      }  
  15.      else
  16.      {  
  17.          //插入失敗
  18.      }  
  19.  }  
儲存過程:

(1)新建儲存過程

  1. create proc MianDemo  
  2. @id int
  3. as
  4. select *  
  5. from dbo.Indicator  
  6. where [email protected]  
上面新建的儲存過程沒有什麼實際意義,只是用來舉例使用的。
(2)EF中執行儲存過程
  1. SqlParameter[] param = new SqlParameter[] { new SqlParameter("@id", 1) };  
  2. var temp = db.ExecuteStoreQuery<Indicator>("exec MianDemo @id",param).ToList();  
  3. foreach (var item in temp)  
  4. {  
  5.     Response.Write(item.Id);  
  6. }  
儲存過程的執行方法與查詢的方法是同一個。
  1. </pre><pre code_snippet_id="1628892" snippet_file_name="blog_20160330_4_5375036" name="code"class="csharp">  

到了EF4.1,API的名字又有了些許改變。如果說DbContext將ObjectContext做了包裝,那麼DbContext.Database就是對應於資料庫端資訊的封裝。執行SQL命令也自然從Database型別開始。對應於ExecuteStoreCommand和ExecuteStoreQuery<T>的是Database.ExecuteSqlCommand和Database.SqlQuery<T>。

只要修改上面的程式碼的方法名稱,就可以實現程式碼重用,在此就不在羅列了。

OK,經過上面的練習,不知你是否掌握瞭如何在EF中執行sql語句呢?

相關推薦

Asp.Net MVC EF之一:使用Database類在EF框架執行Sql語句

包括 ans cti foo lists sele 下場 tex 對數 h4 { padding: 8px 5px; background-color: #32c5d2 } .start-box,.body { padding: 10px } .tit { font-siz

ado.net EFado.net區別比較

ado.net EF與ado.net區別比較、在EF中使用執行sql語句 (1).net: 最核心的基礎平臺(可以看做執行環境和巨多類庫),僅次於作業系統 (2)asp.net: .net平臺下進行網站開發的框架 (3)asp.net MVC:asp.net 框架下開發網頁的一種框架 (4)

ado.net EFado.net區別比較EF使用執行sql語句

ado.net EF作為微軟的一個ORM框架,通過實體、關係型資料庫表之間的對映,使開發人員可以通過操作表實體而間接的操作資料庫,大大的提高了開發效率。 這樣一來,.net平臺下,我們與底層資料庫的互動就有兩種選擇了(這句話說得不是很準確,微軟.net 框架下還是有其他的O

關於ASP.NET WebFormASP.NET MVC的比較

WebForm的理解 1、 WebForm概念 ASP.NETWebform提供了一個類似於Winform的事件響應GUI模型(event-drivenGUI),隱藏了HTTP、HTML、JavaScript等細節,將使用者介面構建成一個伺服器端的樹結構控制元件(Co

MySQL儲存引擎MyISAMInnoDB的區別比較

使用MySQL當然會接觸到MySQL的儲存引擎,在新建資料庫和新建資料表的時候都會看到。 MySQL的預設引擎5.7以前是MyISAM,5.7以後是InnoDB。建議使用InnoDB。 至於到底用哪種儲存引擎比較好?這個問題沒有定論,需要根據你的需求和環境來衡量。所以對這兩種引擎

JSONXML的區別比較

1.定義介紹 (1).XML定義擴充套件標記語言 (Extensible Markup Language, XML) ,用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。 XML使用DTD(document type definiti

floatdouble型別區別比較

單精度浮點數在機內佔4個位元組,用32位二進位制描述。 雙精度浮點數在機內佔8個位元組,用64位二進位制描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔1位二進位制,表示數的正負。指數符佔1位二進位制,表示指數的正負。尾數表示浮點數有效數字

.NET base64檔案互轉方法 byte[]檔案互轉方法

base64與檔案互轉 /// <summary> /// 檔案轉換成Base64字串 /// </summary> /// <param name="fileName">檔案絕對路徑<

非同步請求xhrajaxaxiosfetch的區別比較

目錄 1. XMLHttpRequest物件 2. jQuery ajax 3. axios 4. fetch 參考 why: 為什麼會出現不同的方法呢? wha

net mvc3 直接執行sql語句

1) SQL語句查詢實體 var members = db.Members.SqlQuery( "select * from Member").ToList()

asp.net執行sql語句(C#)

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using Syste

iBATIS.net直接執行sql語句

在用iBatis.net與資料庫打交道的過程中,發現iBatis.net拼接字串不能直接拷貝然後在dbms裡執行(獲取runtime時的sql語句都是帶@param1,@param2,@param3,...這樣的形式)。有時候sql語句一個小小的標點(都怪自己學藝不精,呵呵

用Python socket實現一個簡單的http伺服器(post get 的區別CGIHTTPServer 簡單應用

#!/usr/bin/env python #coding=utf-8import socketimport re HOST = '' PORT = 8000#Read index.html, put into HTTP response dataindex_content = '''HTTP/1.x 200

fragmentonCreateViewonActivityCreated的區別,以及fragment生命週期的利用

最近使用了一個自定義的view在activity中執行正常,可在fragment中就奔潰,無提示,之前view是在onCreateView中初始化並呼叫的,崩潰,換到onActivityCreated之後,執行ok了,這是什麼原因呢?? 先看看fragment的生命週期,首

LinuxVxWorks主要區別(二):執行模式

Linux與VxWorks的主要區別 2、執行模式     Linux           VxWorks    保護模式         真實模式 VxWorks上應用程式執行在“真實模式”下,無使用者模式和核心模式之分; Linux則是採用“保護模式”,

.NET進階篇06-async非同步thread多執行緒2

知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 內容目錄 一、執行緒Thread1、生命週期2、後臺執行緒3、靜態方法1.執行緒本地儲存2.記憶體柵欄4、返回值二、執行緒池ThreadPool1、工作佇列2、工作執行緒和IO執行緒3、和Thread區別4、定時器 一、執行緒Threa

.NET進階篇06-async非同步thread多執行緒3

知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 梯子 一、任務Task1、啟動任務2、阻塞延續3、任務層次結構4、列舉引數5、任務取消6、任務結果7、異常二、並行Parallel1、Parallel.For()、Parallel.ForEach()2、Parallel.For3、Par

.NET進階篇06-async非同步thread多執行緒4

知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 梯子 一、鎖1、lock2、Interlocked3、Monitor4、SpinLock5、Mutex6、Semaphore7、Events1、AutoResetEvent2、ManualResetEvent3、ManualResetEv

EF執行SQL語句 結果和直接在Sqlserver執行結果不一致

enume 出了 text con query context png syn raw 先說問題 直接執行sql的結果 var result = base.Context.Customers.SqlQuery(sql);   sql 語句是打斷點取得的,連接的也

EF執行SQL語句和存儲過程

div spa rip mman code rom {0} base result EF雖然使用對象化的方式避免了我們寫SQL,但是對於部分SQL,例如需要復雜的查詢、執行插入和刪除等可以操作,直接執行SQL可以減少減少性能上的損失。 使用EF執行SQL可以通過Execut