.Net开源微型ORM框架测评
? 什么是ORM?
?
? ? ? 對象關系映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言里使用的“虛擬對象數據庫”。
?
一般的ORM包括以下四部分:
一個對持久類對象進行CRUD操作的API;
一個語言或API用來規定與類和類屬性相關的查詢;
一個規定MAPPING?METADATA的工具;
一種技術可以讓ORM的實現同事務對象一起進行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的優化操作。
本次對比的.NET ORM框架
1. Entity Framework
官網?https://msdn.microsoft.com/zh-cn/data/ef.aspx
2. Dapper
官網?https://github.com/StackExchange/dapper-dot-net
3. PetaPoco
官網?http://www.toptensoftware.com/petapoco/
?
對比因素
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相比下來都是比較輕的,而且用起來的話也是非常靈活的。哪一個更適合你的項目,用起來更順手,才是最好的選擇方案。
原文地址:http://www.cnblogs.com/myshowtime/p/5951270.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的.Net开源微型ORM框架测评的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建分布式 ASP.NET Core W
- 下一篇: Redis集群~StackExchang