ado.net EF與ado.net區別比較、在EF中使用執行sql語句
這樣一來,.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語句來執行。比如:
- From a in Context.Student
- Where a.id =1
- Select a;
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命令了。(個人覺得其實很煩,呵呵)例如:
- EntityConnection entityConnection = (EntityConnection)ctx.Connection;
- DbConnection storeConnection = entityConnection.StoreConnection;
- DbCommand cmd = storeConnection.CreateCommand();
- cmd.CommandType = System.Data.CommandType.StoredProcedure;
- cmd.CommandText = "[PRO_USER_DIGITALCARD_CHECK]";
- //。。。。。。。
在EF4(.NET 4)中,我們有了全新的API:ObjectContext.ExecuteStoreCommand(...)和 ObjectContext.ExecuteStoreQuery<T>(...)。從函式名不難知道前者是為了執行某一併無返回集的SQL 命令,例如UPDATE,DELETE操作;後者是執行某一個查詢,並可以將返回集轉換為某一物件。
- using (FlowersPlatformEntities db = new FlowersPlatformEntities())
- {
- string selectSql = "select * from Flower";
- ObjectResult<Flower> result = db.ExecuteStoreQuery<Flower>(selectSql, null);
- foreach (var item in result)
- {
- //遍歷查詢結果
- }
- string insertSql = "insert into dbo.Flower values('月季','月季很好看。。。。。。')";
- int res = db.ExecuteStoreCommand(insertSql, null);
- if (res > 0)
- {
- //插入成功
- }
- else
- {
- //插入失敗
- }
- }
(1)新建儲存過程
- create proc MianDemo
- @id int
- as
- select *
- from dbo.Indicator
- where [email protected]
(2)EF中執行儲存過程
- SqlParameter[] param = new SqlParameter[] { new SqlParameter("@id", 1) };
- var temp = db.ExecuteStoreQuery<Indicator>("exec MianDemo @id",param).ToList();
- foreach (var item in temp)
- {
- Response.Write(item.Id);
- }
- </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 EF與ado.net區別比較
ado.net EF與ado.net區別比較、在EF中使用執行sql語句 (1).net: 最核心的基礎平臺(可以看做執行環境和巨多類庫),僅次於作業系統 (2)asp.net: .net平臺下進行網站開發的框架 (3)asp.net MVC:asp.net 框架下開發網頁的一種框架 (4)
ado.net EF與ado.net區別比較、在EF中使用執行sql語句
ado.net EF作為微軟的一個ORM框架,通過實體、關係型資料庫表之間的對映,使開發人員可以通過操作表實體而間接的操作資料庫,大大的提高了開發效率。 這樣一來,.net平臺下,我們與底層資料庫的互動就有兩種選擇了(這句話說得不是很準確,微軟.net 框架下還是有其他的O
關於ASP.NET WebForm與ASP.NET MVC的比較
WebForm的理解 1、 WebForm概念 ASP.NETWebform提供了一個類似於Winform的事件響應GUI模型(event-drivenGUI),隱藏了HTTP、HTML、JavaScript等細節,將使用者介面構建成一個伺服器端的樹結構控制元件(Co
MySQL儲存引擎MyISAM與InnoDB的區別比較
使用MySQL當然會接觸到MySQL的儲存引擎,在新建資料庫和新建資料表的時候都會看到。 MySQL的預設引擎5.7以前是MyISAM,5.7以後是InnoDB。建議使用InnoDB。 至於到底用哪種儲存引擎比較好?這個問題沒有定論,需要根據你的需求和環境來衡量。所以對這兩種引擎
JSON與XML的區別比較
1.定義介紹 (1).XML定義擴充套件標記語言 (Extensible Markup Language, XML) ,用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。 XML使用DTD(document type definiti
float與double型別區別比較
單精度浮點數在機內佔4個位元組,用32位二進位制描述。 雙精度浮點數在機內佔8個位元組,用64位二進位制描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔1位二進位制,表示數的正負。指數符佔1位二進位制,表示指數的正負。尾數表示浮點數有效數字
.NET base64與檔案互轉方法、 byte[]與檔案互轉方法
base64與檔案互轉 /// <summary> /// 檔案轉換成Base64字串 /// </summary> /// <param name="fileName">檔案絕對路徑<
非同步請求xhr、ajax、axios與fetch的區別比較
目錄 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
fragment中onCreateView與onActivityCreated的區別,以及fragment中生命週期的利用
最近使用了一個自定義的view在activity中執行正常,可在fragment中就奔潰,無提示,之前view是在onCreateView中初始化並呼叫的,崩潰,換到onActivityCreated之後,執行ok了,這是什麼原因呢?? 先看看fragment的生命週期,首
Linux與VxWorks主要區別(二):執行模式
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