什麼是ORM?git
對象關係映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換。從效果上說,它實際上是建立了一個可在編程語言裏使用的「虛擬對象數據庫」。github
本次對比的.NET ORM框架sql
1. Entity Framework數據庫
官網 https://msdn.microsoft.com/zh-cn/data/ef.aspx編程
2. Dapperapp
官網 https://github.com/StackExchange/dapper-dot-net框架
3. PetaPoco編程語言
官網 http://www.toptensoftware.com/petapoco/ide
對比因素工具
1. 操做的難易程度
2. 執行的效率
3. 跨數據庫的使用
Entity Framework
1.新建C#控制檯
2. 使用NuGet引用EF組件
項目引用 右鍵 管理NuGet程序包 在聯機裏下載並安裝Entity Framework
項目右鍵 新建 添加 新建項 ADO.NET實體數據模型
我這裏的CLN用的是數據庫名
添加過之後 有一個實體模型數據嚮導 選擇 從數據庫生成 下一步 這裏是配置數據庫鏈接 新建鏈接 將App.Config的實體鏈接設置爲CLNContext
而後又出現一個對話框 -- 您要在模型中包含哪些數據庫對象,這裏把表勾上,點擊完成就OK了,而後會彈出兩個警告框,這是由於有兩個TT模板須要執行,不用管它,肯定就好了,這是出現了Edmx數據庫模型關係圖
接下來就是進入項目的 Program.cs裏面寫代碼了
static void Main(string[] args) { Stopwatch S = new Stopwatch(); //秒錶對象 計時 S.Start(); var DBContext = new CLNContext(); foreach (var item in DBContext.NT_Photo) { Console.WriteLine(item.PostIP); } Console.WriteLine(S.Elapsed); Console.ReadKey(); }
NT_Photo 表裏有600多條數據,這裏看到查詢的速度仍是蠻快的 EF用時5.9秒
Dapper
1.一樣新建控制檯程序
2. NuGet引用Dapper
Dapper沒有EF那麼強大,至關於一個SqlHelper,咱們須要手動配置鏈接字符串,這裏把剛纔EF生成的NT_Photo.cs 模型類,放到項目裏面,而後就是就是進入到Program.cs裏面寫代碼了
using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using Dapper; using System.Diagnostics; using System.Threading; namespace DapperForsql { class Program { static void Main(string[] args) { Stopwatch w = new Stopwatch(); w.Start(); var str = "data source=.;initial catalog=CLN20140830;integrated security=True"; SqlConnection Con = new SqlConnection(str); var list = Con.Query<NT_Photo>("select * from NT_Photo"); foreach (var item in list) { Console.WriteLine(item.PostIP); } Console.WriteLine(w.Elapsed); Console.ReadKey(); } } }
咱們這裏用了SqlConnertion對象,由於Dapper是對IDbConnection作了擴展, SqlConnection是實現了IDbConnection,而後在咱們引用Dapper的命名空間using Dapper;
這裏能夠看到,Dapper比EF更快 Dapper用時3.0秒
PetaPoco
1.一樣新建控制檯程序
2.使用NuGet引用PetaPoco組件
3.配置App.Config裏的鏈接字符串
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="CLNContext" connectionString="data source=.;initial catalog=CLN20140830;integrated security=True;" providerName="System.Data.SqlClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
4. 安裝PetaPoco後,一樣會自動生成數據庫訪問上下文和模型Model,這裏打開 Models -> Database.tt ,修改 ConnectionStringName = "CLNContext";這裏要和App.Config裏的鏈接字符串保持一致,更改過之後保存,會自動生成數據庫訪問上下文,Models -> Database.tt -> Database.cs
5.準備工做完畢,就是進入正題了,一樣進入到 Program.cs
static void Main(string[] args) { var Context = new CLNContext.CLNContextDB(); Stopwatch s = new Stopwatch(); s.Start(); var list = Context.Query<NT_Photo>("select * from NT_Photo"); foreach (var item in list) { Console.WriteLine(item.PostIP); } Console.WriteLine(s.Elapsed); Console.ReadKey(); }
這裏PetaPoco 也有數據庫訪問上下文CLNContextDB(),不過也是須要寫SQL語句的,先看一下查詢速度
在這裏能夠看到,PetaPoco貌似更快 PetaPoco用時2.4秒
其實PetaPoco更強大的是,它對模型作了增刪改查的方法,這就很是方便了
NT_Photo PP = new NT_Photo(); var res= PP.Insert();
//res就是返回插入的數據的ID
對比結果:
這裏能夠看到EF,Dapper,PetaPoco 的差異了
NT_Photo 600多條數據
EF ------ 5.9秒
Dapper ------- 3.0秒
PetaPoco ------- 2.4秒
其實EF第一次的話,會慢一些,第一次會把一些模型數據加載到內存中,後面就很是快了,這裏貼一個EF 暖機代碼
//EF暖機
using (var db = new CLNContext()) { var objectContext = ((IObjectContextAdapter)db).ObjectContext; var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace); mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>()); }
總結:每一個ORM的存在都有它的價值,不能說哪一個哪一個好,EF是微軟自家推出的,不少代碼都是自動生成的,一句SQL語句都不用寫,確實很是方便,可是EF的包很大,有5M多,並且微軟封裝好的也不太利於擴展,像寫一些複雜的SQl語句就不是很方便了,Dapper 和PetaPoco相比下來都是比較輕的,並且用起來的話也是很是靈活的。哪個更適合你的項目,用起來更順手,纔是最好的選擇方案。
源碼 源碼在這裏