.Net开源微型ORM框架测评
? 什么是ORM?
?
? ? ? 對象關(guān)系映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。從效果上說,它其實(shí)是創(chuàng)建了一個(gè)可在編程語言里使用的“虛擬對象數(shù)據(jù)庫”。
?
一般的ORM包括以下四部分:
一個(gè)對持久類對象進(jìn)行CRUD操作的API;
一個(gè)語言或API用來規(guī)定與類和類屬性相關(guān)的查詢;
一個(gè)規(guī)定MAPPING?METADATA的工具;
一種技術(shù)可以讓ORM的實(shí)現(xiàn)同事務(wù)對象一起進(jìn)行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的優(yōu)化操作。
本次對比的.NET ORM框架
1. Entity Framework
官網(wǎng)?https://msdn.microsoft.com/zh-cn/data/ef.aspx
2. Dapper
官網(wǎng)?https://github.com/StackExchange/dapper-dot-net
3. PetaPoco
官網(wǎng)?http://www.toptensoftware.com/petapoco/
?
對比因素
1. 操作的難易程度
2. 執(zhí)行的效率
3. 跨數(shù)據(jù)庫的使用
?
Entity?Framework
1.新建C#控制臺
?
2. 使用NuGet引用EF組件
項(xiàng)目引用 右鍵 管理NuGet程序包 在聯(lián)機(jī)里下載并安裝Entity?Framework
?
?項(xiàng)目右鍵 新建 添加 新建項(xiàng) ADO.NET實(shí)體數(shù)據(jù)模型?
我這里的CLN用的是數(shù)據(jù)庫名
?
?添加過以后 有一個(gè)實(shí)體模型數(shù)據(jù)向?qū)?選擇 從數(shù)據(jù)庫生成 下一步 這里是配置數(shù)據(jù)庫連接 新建連接 將App.Config的實(shí)體連接設(shè)置為CLNContext
?
然后又出現(xiàn)一個(gè)對話框 ?-- 您要在模型中包含哪些數(shù)據(jù)庫對象,這里把表勾上,點(diǎn)擊完成就OK了,然后會(huì)彈出兩個(gè)警告框,這是因?yàn)橛袃蓚€(gè)TT模板需要執(zhí)行,不用管它,確定就行了,這是出現(xiàn)了Edmx數(shù)據(jù)庫模型關(guān)系圖
?
接下來就是進(jìn)入項(xiàng)目的?Program.cs里面寫代碼了
static void Main(string[] args){Stopwatch S = new Stopwatch(); ?//秒表對象 計(jì)時(shí)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多條數(shù)據(jù),這里看到查詢的速度還是蠻快的 ?EF用時(shí)5.9秒
?
Dapper
1.同樣新建控制臺程序
2. NuGet引用Dapper
Dapper沒有EF那么強(qiáng)大,相當(dāng)于一個(gè)SqlHelper,我們需要手動(dòng)配置連接字符串,這里把剛才EF生成的NT_Photo.cs 模型類,放到項(xiàng)目里面,然后就是就是進(jìn)入到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對象,因?yàn)镈apper是對IDbConnection做了擴(kuò)展, SqlConnection是實(shí)現(xiàn)了IDbConnection,然后在我們引用Dapper的命名空間using Dapper;
?
?
這里可以看到,Dapper比EF更快 ?Dapper用時(shí)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后,同樣會(huì)自動(dòng)生成數(shù)據(jù)庫訪問上下文和模型Model,這里打開 Models -> Database.tt ,修改?ConnectionStringName = "CLNContext";這里要和App.Config里的連接字符串保持一致,更改過以后保存,會(huì)自動(dòng)生成數(shù)據(jù)庫訪問上下文,Models -> Database.tt -> Database.cs
5.準(zhǔn)備工作完畢,就是進(jìn)入正題了,同樣進(jìn)入到 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 也有數(shù)據(jù)庫訪問上下文CLNContextDB(),不過也是需要寫SQL語句的,先看一下查詢速度
在這里可以看到,PetaPoco貌似更快 PetaPoco用時(shí)2.4秒
其實(shí)PetaPoco更強(qiáng)大的是,它對模型做了增刪改查的方法,這就非常方便了
NT_Photo PP = new NT_Photo(); var res= PP.Insert();//res就是返回插入的數(shù)據(jù)的ID
對比結(jié)果:
這里可以看到EF,Dapper,PetaPoco 的差別了
NT_Photo 600多條數(shù)據(jù)
EF ? ? ? ? ? ?------ ? 5.9秒
Dapper ? ? ------- ?3.0秒
PetaPoco ? ------- ?2.4秒
?
其實(shí)EF第一次的話,會(huì)慢一些,第一次會(huì)把一些模型數(shù)據(jù)加載到內(nèi)存中,后面就非常快了,這里貼一個(gè)EF 暖機(jī)代碼
//EF暖機(jī)
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>());}
總結(jié):每個(gè)ORM的存在都有它的價(jià)值,不能說哪個(gè)哪個(gè)好,EF是微軟自家推出的,很多代碼都是自動(dòng)生成的,一句SQL語句都不用寫,確實(shí)非常方便,但是EF的包很大,有5M多,而且微軟封裝好的也不太利于擴(kuò)展,像寫一些復(fù)雜的SQl語句就不是很方便了,Dapper 和PetaPoco相比下來都是比較輕的,而且用起來的話也是非常靈活的。哪一個(gè)更適合你的項(xiàng)目,用起來更順手,才是最好的選擇方案。
原文地址:http://www.cnblogs.com/myshowtime/p/5951270.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的.Net开源微型ORM框架测评的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建分布式 ASP.NET Core W
- 下一篇: 在.NET Core中使用MEF