什麼是ORM?
物件關係映射(英文:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換。從效果上來說,它其實是創建了一個可在程式語言裡使用的「虛擬物件資料庫」。
一般的ORM包括以下四個部分:
一個對持久類別物件進行CRUD操作的API;
一個語言或API用來規定與類別和類別屬性相關的查詢;
一個規定一個語言或API用來規定與類別和類別屬性相關的查詢;工具;
一種技術可以讓ORM的實作同事務物件一起進行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的最佳化操作。
這次比較的.NET ORM框架
1. Entity Framework
官網 https://msdn.microsoft.com/zh-cn/data/ef.aspx
2. Dapper
官網github.com/StackExchange/dapper-dot-net3. PetaPoco官網 http://www.toptensoftware.com/petapoco/ 對比因素1. 操作的難易度.執行的效率
3. 跨資料庫的使用
Entity Framework
1.新建C#控制台
2. 使用NuGetEF48元件套件在N並安裝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秒
組,程式
2. NuGet引用Dapper
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(); } } }
PetaPoco
組件使用3.0秒
PetaPoco
組件使用231. 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 ,修改 StringName = "CLNContext";這裡在這裡ConnectionConnection要和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相比下来都是比较轻的,而且用起来的话也是非常灵活的。哪一个更适合你的项目,用起来更顺手,才是最好的选择方案。