.NET常見ORM框架

来源:https://www.cnblogs.com/NET6/archive/2022/04/16/16154220.html
-Advertisement-
Play Games

前言 在以前的一篇文章中,為大家分享了《什麼是ORM?為什麼用ORM?淺析ORM的使用及利弊》。那麼,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)還是ServiceStack.OrmLite?或者是你還有更好的ORM推 ...


前言

在以前的一篇文章中,為大家分享了《什麼是ORM?為什麼用ORM?淺析ORM的使用及利弊》。那麼,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)還是ServiceStack.OrmLite?或者是你還有更好的ORM推薦呢? 如果有的話,不防也一起分享給大家。

.NET(C#)主流ORM總攬

今天這篇文章分享幾款收集的目前.NET(C#)中比較流行的ORM框架,比如(以下框架均為開源框架,托管於github上):

SqlSugar (國內)

Dos.ORM (國內)

Chloe (國內)

StackExchange/Dapper (國外)

Entity Framework (EF) (國外)

NHibernate (國外)

ServiceStack/ServiceStack.OrmLite (國外)

linq2db (國外)

Massive (國外)

PetaPoco (國外)

SqlSugar

SqlSugar是國人開發者開發的一款基於.NET的ORM框架,是可以運行在.NET 4.+ & .NET CORE的高性能、輕量級 ORM框架,眾多.NET框架中最容易使用的資料庫訪問技術。

特點:

開源、免費

國內開發者開發、維護;

支持.NET Core;

支持主流資料庫,如:SQL Server,MySql,Oracle,Sqlite等;

維護更新及時

推薦等級:★★★★☆

PetaPoco

PetaPoco:輕量的POCO對象和資料庫映射的ORM框架。

特點:

開源、免費

推薦等級:★★★★☆

linq2db

linq2db也是一款快速、輕量、類型安全的POCO對象和資料庫映射的ORM框架。從構架上來說,linq2db是對比如:Dapper、PetaPoco這個的微ORM的進一步封裝,但它不像Entity Framework那樣笨重。它沒有實現狀態跟蹤,需要自己處理實體的狀態更改等。

推薦等級:★★★★☆

Dos.ORM

Dos.ORM(原Hxj.Data)於2009年發佈,2015年正式開源。在開發過程中參考了NBear與MySoft,吸取了他們的一些精華,加入新思想,同時參考EF的Lambda語法進行大量擴展。該組件已在數百個成熟項目中應用。官方網站:http://ITdos.com/Dos/ORM/Inde...

特點:

開源、免費

上手簡單,0學習成本。使用方便,按照sql書寫習慣編寫C#.NET代碼。功能強大

高性能,接近手寫Sql

體積小(不到150kb,僅一個dll)

完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等資料庫

支持大量Lambda表達式寫法,國產ORM支持度最高,開源中國ORM排行前三

不需要像NHibernate的XML配置,不需要像EF的各種資料庫連接驅動

遵循MIT開源協議,除不允許改名,其它隨意定製修改

推薦等級:★★★☆☆

ServiceStack.OrmLite

ServiceStack.OrmLite的目標是提供一種方便,無干擾,無配置的RDBMS無關類型的封裝,與SQL保持高度的契合,展現直觀的API,可以生成可預測的SQL。

ServiceStack.OrmLite的宗旨:Fast, Simple, Typed ORM for .NET

特點:

開源、收費(免費版只支持單個庫10張表)

推薦等級:★★★☆☆

Entity Framework (EF)

ADO.NET Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的對象關係對應 (O/R Mapping) 解決方案。該框架曾經為.NET Framework的一部分,但version 6之後從.NET Framework分離出來。

推薦等級:★★★☆☆

NHibernate

NHibernate是一個面向.NET環境的對象/關係資料庫映射工具。對象/關係資料庫映射(object/relational mapping,ORM)這個術語表示一種技術,用來把對象模型表示的對象映射到基於SQL的關係模型數據結構中去。

特點:

開源、免費

批量寫入

批量讀/多重查詢特性(我理解是在說Future?)

批量的集合載入

帶有lazy="extra"的集合

集合過濾器和分頁集合

二級緩存(實際上NH的二級緩存貌似也很簡單?)

集成和擴展性

代碼自動生成,減少代碼和sql的開發量,使開發人員擺脫開sql,ado.net和事務,緩存等底層

推薦等級:★★★☆☆

Massive

Massive:小巧,動態的微ORM框架。

推薦等級:★★★☆☆

 

什麼是ORM

ORM(Object-relational mapping),中文翻譯為對象關係映射,是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和資料庫之間映射的元數據,將程式中的對象自動持久化到關係資料庫中。

為什麼用ORM

在程式開發中,資料庫保存的表,欄位與程式中的實體類之間是沒有關聯的,在實現持久化時就比較不方便。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式,為每一種可能的資料庫訪問操作提供單獨的方法。這種方案存在以下不足:

1.持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的介面

2.持久化層同時與域模型與關係資料庫模型綁定,不管域模型還是關係資料庫模型發生變化,毒藥修改持久化曾的相關程式代碼,增加了軟體的維護難度

ORM提供了實現持久化層的另一種模式,它採用映射元數據來描述對象關係的映射,使得ORM中間件能在任何一個應用的業務邏輯層和資料庫層之間充當橋梁

ORM的方法論基於三個核心原則:

簡單:以最基本的形式建模數據

傳達性:資料庫結構被任何人都能理解的語言文檔化

精確性:基於數據模型創建正確標準化了的結構

本文以C#編程語言為例,在傳統的數據讀取操作中,我們以Ado.net的方式對資料庫進行CRUD操作,使用的基本都是SQL硬編碼,比如有以下資料庫查詢操作:

String sql = "SELECT ... FROM persons WHERE id = 10";

DbCommand cmd = new DbCommand(connection, sql);

Result res = cmd.Execute();

String name = res[0]["FIRST_NAME"];

使用了ORM映射的C#實現的偽代碼:

Person p = repository.GetPerson(10);

String name = p.getFirstName();

上面的示例代碼表示我們可以從數據倉庫repository中獲取到一個實體對象,當然數據倉庫中可能包含其他的方法,你也可以定義自己的ORM實現,比如:

Person p = Person.Get(10);

通常,在處理ORM映射和數據倉庫時會暴露一些過濾或者查詢方法,允許客戶端對數據集進行進一步的篩選等操作,比如代碼演示從資料庫中查詢ID=10的用戶:

Person p = Person.Get(Person.Properties.Id == 10);

優/缺點

優點

與傳統的資料庫訪問技術相比,ORM有以下優點:

開發效率更高

數據訪問更抽象、輕便

支持面向對象封裝

缺點

降低程式的執行效率

思維固定化

從系統結構上來看,採用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響。

在我們開發系統時,一般都有性能問題。性能問題主要產生在演算法不正確和與資料庫不正確的使用上。ORM所生成的代碼一般不太可能寫出很高效的演算法,在資料庫應用上更有可能會被誤用,主要體現在對持久對象的提取和和數據的加工處理上,如果用上了ORM,程式員很有可能將全部的數據提取到記憶體對象中,然後再進行過濾和加工處理,這樣就容易產生性能問題。

總結

作為一名編程人員,在ORM使用的觀念上會有不同,具體取捨需根據具體的項目和場景



作者:古蕭龍城IT青年
鏈接:https://www.jianshu.com/p/f308b4cd9670
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問區別,以表格形式做區別; 問流程,以流程圖解釋; 問概念,解釋+通俗易懂日常常見事物/編程常見; 不說廢話,精煉 持更 ...
  • 一、安裝虛擬環境: 命令:pip3 install virtualenv 二、安裝管理工具: 命令:pip3 install virtualenvwrapper 三、新建: 命令:python -m venv 虛擬環境名 或者 virtualenv 虛擬環境名 例如:PS E:\pyapp\pyte ...
  • 今天和大家一起學習一種可視化技術:構建樹狀熱力圖treemap。樹形圖易於可視化,且易於被人理解。樹狀圖通過展示不同大小的矩形,以傳達不同大小的數據量,一般認為,較大的矩形意味著占總體的一大部分,而較小的矩形意味著整體的一小部分。在本文中將和大家一起學習如何使用Squarify庫在 Python 中 ...
  • 前言 大約5年前,想研究javaassistant,cglib等位元組碼操作的相關類庫,來對class進行增強,當要到要操作位元組碼的時候,發現無法繼續下去了,看不懂,只能放棄。 學習jvm位元組碼,需要理解class的組成方式,對彙編,操作棧比較瞭解,無奈,只好重新學習編譯原理,彙編等知識,再來看jvm ...
  • 以下都是springboot的預設配置,如果修改過springboot的配置文件則有可能不起作用。 springboot的resources下的目錄作用 resources/templates 放html文件(只能通過控制類的@RequestMapping跳轉才可以訪問到) resources/st ...
  • 前言 聽說大家都還在用美圖秀秀修圖,今天我用Python給大家表演一下如何修圖。 我們平時使用一些圖像處理軟體時,經常會看到其對圖像的亮度、對比度、色度或者銳度進行調整。你是不是覺得這種技術的底 層實現很高大上? 其實最基礎的實現原理,用 Python 實現只需要幾行代碼,學會後你也可以進行簡單的圖 ...
  • 前言 常見的通知方式有:郵件,電話,簡訊,微信。簡訊和電話:通常是收費的,較少使用;郵件:適合帶文件類型的通知,較正 式,存檔使用;微信:適合告警類型通知,較方便。這裡說的微信,是企業微信。 本文目的:通過企業微信應用給企業成員發消息。 如何實現企業微信通知? 1、新建應用 登陸網頁版企業微信 (h ...
  • 上一篇咱們實現了多個表格數據合併到一個表格,本次咱們來學習如何將表格數據分開導出為PDF文件。 部分數據 然後需要安裝一下這個軟體 wkhtmltopdf 效果展示 將每個數據單獨導出為一個PDF 代碼實現 import pdfkit import openpyxl import os # Pyth ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...