.NET ORM 前言
為什麼要寫這篇文章?
希望針對 SEO 優化搜尋引擎,讓更多中國人知道並且使用。目前百度搜尋 .NET ORM 全是 sqlsugar,我個人是無語的,每每一個人進群第一件事就是拿來比較,每天要重複回答、重複解答、說服他們。想說服標籤是名氣大、使用者多的同型別 .NET ORM 非常困難,最多隻能讓他們勉強接受。FreeSql 不願做自己發光的金子,希望在 2020年 寫下這篇完整一點的 .NET ORM 比較,為準備使用 FreeSql 的朋友解惑,能排上百度搜尋引擎當然再好不過了。
肯請正在使用 CSRedisCore、FreeSql 的朋友,動一動手指轉發本文,並加上原文連結指向本文,謝謝! QQ群:4336577(已滿)、8578575(線上)、52508226(線上)
原創文章歡迎轉載,2020年中文版 .NET ORM 完整功能比較
MarkDown:https://files.cnblogs.com/files/kellynic/ORM_VS.zip
文章連線:https://www.cnblogs.com/kellynic/p/13664720.html
.NET ORM 基礎資訊比較
功能項 | FreeSql | EFCore | SqlSugar |
---|---|---|---|
出生時間 | 2018年12月 | 2015年(約) | 2014年(約) |
開源協議 | MIT | Apache-2.0 | Apache-2.0 |
所屬機構 | dotnetcore(NCC) | dotnet | sunkaixuan(個人) |
單元測試數量 | 5500+ | 很多 | 無 |
github star | 2.1k+ | 9.5k+ | 3.1k+ |
github issues | 活躍 | 活躍 | 不活躍 |
支援平臺 | .NET4.0+、.NETCore | .NETCore | .NET4.5+、.NETCore |
支援資料庫 | 很多,並且行為一致 | 很多 | SqlServer/MySql/Sqlite/Oracle |
生命週期 | Singleton | Scoped | Scoped |
使用方式 | IFreeSql、Repository | DbContext | SugarClient |
FreeSql .NET ORM 支援 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/人大金倉/神舟通用/Access。
.NET ORM 各有自已看家本領,本文主要按 FreeSql 提供的功能進行列舉比較,如有冒犯請見諒,也歡迎向 FreeSql 提出功能建議。
每個功能實現的深度層次不一樣(比如 EFCore 支援 SqlServer 2012,FreeSql 支援 SqlServer 2005),很難徹底比較,提示:
- 本文比較的功能 FreeSql 每種資料庫基本都有提供,不像 EFCore 偏向 SqlServer
- 本文只比較官方提供的功能(不包含第三方擴充套件)
.NET ORM 整體功能比較
功能項 | FreeSql | EFCore | SqlSugar |
---|---|---|---|
.NET ORM CodeFirst 根據實體型別,建立表結構 | ✔ | ✔ | ✔ |
.NET ORM CodeFirst 根據實體型別,對比表結構 | ✔ | ✔ | - |
.NET ORM CodeFirst 根據實體型別註釋,遷移表結構備註 | ✔ | - | - |
.NET ORM CodeFirst FluentApi | ✔ | ✔ | - |
.NET ORM CodeFirst FluentApi 語法相容 EFCore | ✔ | ✔ | - |
.NET ORM CodeFirst 實體特性相容 EFCore | ✔ | ✔ | - |
.NET ORM CodeFirst 自定義實體特性(Aop) | ✔ | - | ✔ |
.NET ORM CodeFirst 型別轉換對映(MapType) | ✔ | ✔ | - |
.NET ORM DbFirst 根據資料庫,生成實體類 | ✔ | ✔ | ✔ |
.NET ORM 導航屬性(OneToOne) | ✔ | ✔ | - |
.NET ORM 導航屬性(ManyToOne) | ✔ | ✔ | - |
.NET ORM 導航屬性(OneToMany) | ✔ | ✔ | - |
.NET ORM 導航屬性(ManyToMany) | ✔ | - | - |
.NET ORM 導航屬性(Parent) 父子關係的實體類 | ✔ | - | - |
.NET ORM 導航屬性延時載入、貪婪載入、級聯儲存 | ✔ | ✔ | - |
.NET ORM 自定義表示式樹解析 | ✔ | - | - |
.NET ORM 全域性過濾器 | ✔ | ✔ | - |
.NET ORM 事務 | ✔ | ✔ | ✔ |
.NET ORM 讀寫分離 | ✔ | - | ✔ |
.NET ORM 分表分庫 | ✔ | - | - |
.NET ORM 倉儲 Repository | ✔ | - | - |
.NET ORM 工作單元 UnitOfWork | ✔ | - | - |
.NET ORM 工作單元管理器 UnitOfWorkManager | ✔ | - | - |
.NET ORM DbContext 狀態管理 | ✔ | ✔ | - |
.NET ORM CRUD 功能比較
功能項 | FreeSql | EFCore | SqlSugar |
---|---|---|---|
.NET ORM CRUD 時,對映動態表名 | ✔ | - | ✔ |
.NET ORM CRUD 時,使用引數化 SQL 執行 | ✔ | ✔ | ✔ |
.NET ORM CRUD 時,不使用引數化 SQL 執行(NoneParameter) | ✔ | - | - |
.NET ORM CRUD 時,獲取對應的 SQL(ToSql) | ✔ | - | ✔ |
.NET ORM CRUD 時,統一審計實體屬性值(Aop.AuditValue) | ✔ | - | - |
.NET ORM 插入(單條) | ✔ | ✔ | ✔ |
.NET ORM 插入時,忽略/指定列 | ✔ | - | ✔ |
.NET ORM 插入時,返回影響的行數 | ✔ | - | ✔ |
.NET ORM 插入時,返回插入後的自增值 | ✔ | ✔ | ✔ |
.NET ORM 插入時,返回插入後的記錄 | ✔ | - | - |
.NET ORM 插入時,Insert Ignore Into | ✔ | - | - |
.NET ORM 插入時,On Duplicate Key Update | ✔ | - | - |
.NET ORM 插入時,On Conflict Do Update | ✔ | - | - |
.NET ORM 批量插入 效能測試結果參考文件 | ✔ | - | ✔ |
.NET ORM 批量插入時,自動分批 參考文件 | ✔ | - | - |
.NET ORM 批量插入時,使用BulkCopy | ✔ | - | - |
.NET ORM 更新(單條) | ✔ | ✔ | ✔ |
.NET ORM 更新時,動態條件(WhereDynamic) | ✔ | - | ✔ |
.NET ORM 更新時,根據實體物件更新 | ✔ | - | ✔ |
.NET ORM 更新時,根據狀態管理只更新有變化的屬性 | ✔ | ✔ | - |
.NET ORM 更新時,忽略/指定列 | ✔ | - | ✔ |
.NET ORM 更新時,原子性 set num=num+1 | ✔ | - | ✔ |
.NET ORM 更新時,指定條件 | ✔ | - | ✔ |
.NET ORM 更新時,自動附加全域性過濾器條件 | ✔ | - | - |
.NET ORM 更新時,不需要先查詢 | ✔ | - | ✔ |
.NET ORM 更新時,使用樂觀行鎖 | ✔ | ✔ | - |
.NET ORM 更新時,使用悲觀鎖 | ✔ | - | - |
.NET ORM 更新時,返回影響的行數 | ✔ | - | ✔ |
.NET ORM 更新時,返回插入後的記錄 | ✔ | - | - |
.NET ORM 批量更新 | ✔ | - | - |
.NET ORM 刪除(單條) | ✔ | ✔ | ✔ |
.NET ORM 刪除時,動態條件(WhereDynamic) | ✔ | - | ✔ |
.NET ORM 刪除時,指定條件 | ✔ | - | ✔ |
.NET ORM 刪除時,自動附加全域性過濾器條件 | ✔ | - | - |
.NET ORM 刪除時,不需要先查詢 | ✔ | - | ✔ |
.NET ORM 刪除時,返回影響的行數 | ✔ | - | ✔ |
.NET ORM 刪除時,返回插入後的記錄 | ✔ | - | - |
.NET ORM 級聯儲存 | ✔ | ✔ | - |
.NET ORM 新增或更新 | ✔ | - | ✔ |
.NET ORM 新增或更新,自動適配 merge into 參考文件 | ✔ | - | - |
.NET ORM 批量編輯儲存 參考文件 | ✔ | ✔ | - |
.NET ORM 查詢(單條) | ✔ | ✔ | ✔ |
.NET ORM 查詢時,分頁 | ✔ | ✔ | ✔ |
.NET ORM 查詢時,分頁支援 SqlServer2008 | ✔ | - | ✔ |
.NET ORM 查詢時,動態條件(WhereDynamic) | ✔ | - | ✔ |
.NET ORM 查詢時,動態過濾條件(WhereDynamicFilter) 參考文件 | ✔ | - | ✔ |
.NET ORM 查詢時,自動附加全域性過濾器條件 | ✔ | - | - |
.NET ORM 查詢時,多表條件傳播(WhereCascade) | ✔ | - | - |
.NET ORM 查詢時,在 lambda 中使用導航屬性 | ✔ | ✔ | - |
.NET ORM 查詢時,用 Dto 對映只需要查詢的欄位 | ✔ | - | - |
.NET ORM 查詢時,傳 Sql 作二次查詢(WithSql) | ✔ | - | ✔ |
.NET ORM 查詢時,子查詢(Exists) | ✔ | - | ✔ |
.NET ORM 查詢時,子查詢(In) | ✔ | - | ✔ |
.NET ORM 查詢時,子查詢拼接結果(string.Join) 參考文件 | ✔ | - | - |
.NET ORM 查詢時,使用分組聚合(GroupBy/Having) | ✔ | ✔ | ✔ |
.NET ORM 查詢時,使用 Linq To Sql 語法 | ✔ | ✔ | - |
.NET ORM 查詢時,針對樹形結構表 父子關係的實體類 | ✔ | - | - |
.NET ORM 總結
.NET ORM FreeSql 功能強大,擴充套件方便,從 issues 和 qq群 可以看得出社群更新極積有問必應;
.NET ORM EFCore 主要是物件導向操作,許多方式不符合中國人習慣,長期更新(但不友好相容);
.NET ORM SqlSugar 歷史問題多,並且 issues 和 qq群 已經基本不解決問題;
.NET ORM FreeSql 作者的努力希望能打動到你,肯請正在使用的、善良的您能動一動小手指,把文章轉發一下,讓更多人知道 .NET 有這樣一個好用的 ORM 存在。謝謝了!!
.NET ORM FreeSql 開源協議 MIT https://github.com/dotnetcore/FreeSql,可以商用,文件齊全。QQ群:4336577(已滿)、8578575(線上)、52508226(線上)
如果你有好的 ORM 實現想法,歡迎給作者留言討論,謝謝觀看!