什么是orm?
?? ? 對(duì)象關(guān)系映射(英語(yǔ):Object Relation Mapping,簡(jiǎn)稱ORM,或O/RM,或O/R mapping),是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。從效果上說,它其實(shí)是創(chuàng)建了一個(gè)可在編程語(yǔ)言里使用的“虛擬對(duì)象數(shù)據(jù)庫(kù)”。
?
一般的ORM包括以下四部分:
一個(gè)對(duì)持久類對(duì)象進(jìn)行CRUD操作的API;
一個(gè)語(yǔ)言或API用來規(guī)定與類和類屬性相關(guān)的查詢;
一個(gè)規(guī)定MAPPING?METADATA的工具;
一種技術(shù)可以讓ORM的實(shí)現(xiàn)同事務(wù)對(duì)象一起進(jìn)行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的優(yōu)化操作。
本次對(duì)比的.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/
?
對(duì)比因素
1. 操作的難易程度
2. 執(zhí)行的效率
3. 跨數(shù)據(jù)庫(kù)的使用
?
Entity?Framework
1.新建C#控制臺(tái)
2. 使用NuGet引用EF組件
項(xiàng)目引用 右鍵 管理NuGet程序包 在聯(lián)機(jī)里下載并安裝Entity?Framework
?項(xiàng)目右鍵 新建 添加 新建項(xiàng) ADO.NET實(shí)體數(shù)據(jù)模型?
我這里的CLN用的是數(shù)據(jù)庫(kù)名
?添加過以后 有一個(gè)實(shí)體模型數(shù)據(jù)向?qū)?選擇 從數(shù)據(jù)庫(kù)生成 下一步 這里是配置數(shù)據(jù)庫(kù)連接 新建連接 將App.Config的實(shí)體連接設(shè)置為CLNContext
然后又出現(xiàn)一個(gè)對(duì)話框 ?-- 您要在模型中包含哪些數(shù)據(jù)庫(kù)對(duì)象,這里把表勾上,點(diǎn)擊完成就OK了,然后會(huì)彈出兩個(gè)警告框,這是因?yàn)橛袃蓚€(gè)TT模板需要執(zhí)行,不用管它,確定就行了,這是出現(xiàn)了Edmx數(shù)據(jù)庫(kù)模型關(guān)系圖
接下來就是進(jìn)入項(xiàng)目的?Program.cs里面寫代碼了
static void Main(string[] args) { Stopwatch S = new Stopwatch(); //秒表對(duì)象 計(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.同樣新建控制臺(tái)程序
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對(duì)象,因?yàn)镈apper是對(duì)IDbConnection做了擴(kuò)展, SqlConnection是實(shí)現(xiàn)了IDbConnection,然后在我們引用Dapper的命名空間using Dapper;
這里可以看到,Dapper比EF更快 ?Dapper用時(shí)3.0秒
?
PetaPoco
1.同樣新建控制臺(tái)程序
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ù)庫(kù)訪問上下文和模型Model,這里打開 Models -> Database.tt ,修改?ConnectionStringName = "CLNContext";這里要和App.Config里的連接字符串保持一致,更改過以后保存,會(huì)自動(dòng)生成數(shù)據(jù)庫(kù)訪問上下文,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ù)庫(kù)訪問上下文CLNContextDB(),不過也是需要寫SQL語(yǔ)句的,先看一下查詢速度
在這里可以看到,PetaPoco貌似更快 PetaPoco用時(shí)2.4秒
其實(shí)PetaPoco更強(qiáng)大的是,它對(duì)模型做了增刪改查的方法,這就非常方便了
NT_Photo PP = new NT_Photo(); var res= PP.Insert(); //res就是返回插入的數(shù)據(jù)的ID
對(duì)比結(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語(yǔ)句都不用寫,確實(shí)非常方便,但是EF的包很大,有5M多,而且微軟封裝好的也不太利于擴(kuò)展,像寫一些復(fù)雜的SQl語(yǔ)句就不是很方便了,Dapper 和PetaPoco相比下來都是比較輕的,而且用起來的話也是非常靈活的。哪一個(gè)更適合你的項(xiàng)目,用起來更順手,才是最好的選擇方案。
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)