程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net開源微型ORM框架測評,.netorm框架

.Net開源微型ORM框架測評,.netorm框架

編輯:關於.NET

.Net開源微型ORM框架測評,.netorm框架


  什麼是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相比下來都是比較輕的,而且用起來的話也是非常靈活的。哪一個更適合你的項目,用起來更順手,才是最好的選擇方案。


 

   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved