.Net orm 开源项目 FreeSql 2.0.0
寫在開頭
2018年11月頭腦發(fā)熱到今天,一晃已經(jīng)兩年,當初從舒服區(qū)走向一個巨大的坑,回頭一看后背一涼。
兩年時間從無到有,經(jīng)歷數(shù)不清的日夜奮斗(有人問花了多長時間投入,答案:全職x2 + 兩年無休息)。
今天 FreeSql 已經(jīng)很強大,感謝第一批、第二批、第N批持續(xù)提出建議的朋友,總算給社區(qū)交了一個滿意答卷。
v2.0.0 是一個穩(wěn)定的版本,主要體現(xiàn):
用戶 API 已經(jīng)確定,不會輕易推翻又作調(diào)整,堅持五年不變的原則,讓使用者真真正正的不再關(guān)心 ORM 使用問題;
單元測試覆蓋面廣,5500+個單元測試,小版本更新升級無須考慮修東墻、補西墻的問題;
經(jīng)歷兩年時間的生產(chǎn)考驗,nuget下載量已超過25萬,平均每日350+;
感嘆:有些人說 .Net 陷入 orm 怪圈,動手的沒幾個,指點江山的一堆,.Net orm 真的如他們所講的簡單嗎?
項目簡介
溫馨提醒:以下內(nèi)容無商吹成份,FreeSql 不打誑語
溫馨提醒:以下內(nèi)容無商吹成份,FreeSql 不打誑語
溫馨提醒:以下內(nèi)容無商吹成份,FreeSql 不打誑語
FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及還有說不出來的運行平臺,因為代碼綠色無依賴,支持新平臺非常簡單。目前單元測試數(shù)量:5400+,Nuget下載數(shù)量:260K+,源碼幾乎每天都有提交。值得高興的是 FreeSql 加入了 ncc 開源社區(qū):https://github.com/dotnetcore/FreeSql,加入組織之后社區(qū)責任感更大,需要更努力做好品質(zhì),為開源社區(qū)出一份力。
QQ群:4336577(已滿)、8578575(在線)、52508226(在線)
為什么要重復造輪子?
FreeSql 主要優(yōu)勢在于易用性上,基本是開箱即用,在不同數(shù)據(jù)庫之間切換兼容性比較好。作者花了大量的時間精力在這個項目,肯請您花半小時了解下項目,謝謝。FreeSql 整體的功能特性如下:
支持 CodeFirst 對比結(jié)構(gòu)變化遷移;
支持 DbFirst 從數(shù)據(jù)庫導入實體類;
支持 豐富的表達式函數(shù),自定義解析;
支持 批量添加、批量更新、BulkCopy;
支持 導航屬性,貪婪加載、延時加載、級聯(lián)保存;
支持 讀寫分離、分表分庫,租戶設(shè)計;
支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/神通/人大金倉/翰高/MsAccess Ado.net 實現(xiàn)包,以及 Odbc 的專門實現(xiàn)包;
5500+個單元測試作為基調(diào),支持10多數(shù)數(shù)據(jù)庫,我們提供了通用Odbc理論上支持所有數(shù)據(jù)庫,目前已知有群友使用 FreeSql 操作華為高斯、mycat、tidb 等數(shù)據(jù)庫。
安裝時選擇對應(yīng)的數(shù)據(jù)庫包:
dotnet add packages FreeSql.Provider.MySqlCodeFirst
FreeSql 使用 CodeFirst 模式開發(fā),簡直不要再簡單,只需要如下定義:
static IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, @"Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10").UseAutoSyncStructure(true) //自動同步實體結(jié)構(gòu)到數(shù)據(jù)庫.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText + "\r\n")) //打印 SQL.Build(); //請務(wù)必定義成 Singleton 單例模式UseAutoSyncStructure(true) 這個設(shè)置開啟自動遷移功能,啥意思?如下實體類:
class Blog {[Column(IsIdentity = true, IsPrimary = true)]public int BlogId { get; set; }public string Url { get; set; }public int Rating { get; set; } }fsql 對 Blog 進行 CRUD 時,比如:
fsql.Select<Blog>().First(); fsql.Select<Blog>().First();會執(zhí)行 SQL 如下:
CREATE TABLE IF NOT EXISTS `cccddd_mysqlconnector`.`Blog` ( `BlogId` INT(11) AUTO_INCREMENT, `Url` VARCHAR(255), `Rating` INT(11) NOT NULL, PRIMARY KEY (`BlogId`) ) Engine=InnoDB;SELECT a.`BlogId`, a.`Url`, a.`Rating` FROM `Blog` a limit 0,1SELECT a.`BlogId`, a.`Url`, a.`Rating` FROM `Blog` a limit 0,1程序運行過程中,首次 CRUD 操作實體類會創(chuàng)建表,之后不再執(zhí)行該操作。
這是表不存在的情況,如果表存在的時候會怎樣?會對比更新結(jié)構(gòu)。FreeSql 對比表結(jié)構(gòu)和實體類的差異部分,執(zhí)行遷移盡量保證不丟數(shù)據(jù)(無法100%保證,請三思使用在生產(chǎn)環(huán)境)
除了自動遷移功能,我們還提供以幾個常用 API fsql.CodeFirst 方法:
| GetComparisonDDLStatements | string | Type | 將實體類型與數(shù)據(jù)庫對比,返回DDL語句 |
| SyncStructure | bool | Type | 同步實體類型到數(shù)據(jù)庫 |
| ConfigEntity | ICodeFirst | Action<TableFluent<T>> | FluentAPI 配置實體的特性 |
| GetTableByEntity | TableInfo | Type | 獲取類型在ORM內(nèi)部的元數(shù)據(jù) |
實體特性
.NET ORM 幾乎都是通過實體與表進行映射,怎么少得了靈活的特性設(shè)置呢。
提示:FreeSql 可以自動識別 EFCore 實體特性 Key/Required/NotMapped/MaxLength/StringLength/DatabaseGenerated/Table/Column
[Table(Name = "topic")] class Topic {[Column(IsPrimary = true, IsIdentity = true, Name = "id")]public int Id { get; set; } }如上 Name 設(shè)置實體類與數(shù)據(jù)庫小寫映射,其實還提供統(tǒng)一處理的方法:
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()//..UseNameConvert(NameConvertType.ToLower)//...Build();// PascalCaseToUnderscore: BigApple -> Big_Apple // PascalCaseToUnderscoreWithUpper: BigApple -> BIG_APPLE // PascalCaseToUnderscoreWithLower: BigApple -> big_apple // ToUpper: BigApple -> BIGAPPLE // ToLower: BigApple -> bigapple // 感謝【曉晨】提供的這個思路和功能CRUD
FreeSql CRUD 命名習慣遵從 SQL,代碼寫起來就像寫 SQL 一樣,如下:
插入數(shù)據(jù):fsql.Insert(item).ExecuteAffrows();
更新數(shù)據(jù):fsql.Update<T>().Where(..).Set(..).ExecuteAffrows();
刪除數(shù)據(jù):fsql.Delete<T>().Where(..).ExecuteAffrows();
查詢數(shù)據(jù):fsql.Select<T>().Where(..).ToList();
Repository
FreeSql.Repository 作為擴展,實現(xiàn)了通用倉儲層功能。與其他規(guī)范標準一樣,倉儲層也有相應(yīng)的規(guī)范定義。FreeSql.Repository 參考 abp vnext 接口,定義和實現(xiàn)基礎(chǔ)的倉儲層(CURD),應(yīng)該算比較通用的方法吧。倉儲可以:
Select/Attach 快照對象,Update 只更新變化的字段;
Insert 插入數(shù)據(jù),適配各數(shù)據(jù)庫優(yōu)化執(zhí)行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;
InsertOrUpdate 插入或更新;
SaveMany 方法快速保存導航對象(一對多、多對多);
UnitOfWork 工作單元設(shè)置;
導航屬性
微軟制造了優(yōu)秀的語言 c#,利用語言特性可以做一些非常好用的功能,在 ORM 中使用導航屬性非常適合。
FreeSql ManyToOne(N對1) 提供了簡單的多表 join 查詢;
FreeSql OneToMany(1對N) 提供了簡單可控的級聯(lián)查詢、級聯(lián)保存功能;
FreeSql ManyToMany(多對多) 提供了簡單的多對多過濾查詢、級聯(lián)查詢、級聯(lián)保存功能;
FreeSql 父子關(guān)系 提供了常用的 CTE查詢、刪除、遞歸功能;
關(guān)于導航屬性,我們寫了一篇專門介紹的文章,可跳轉(zhuǎn)查看:.NET ORM 導航屬性【到底】可以解決什么問題?
分表分庫
關(guān)于分表分庫,我們寫了一篇專門介紹的文章,可跳轉(zhuǎn)查看:.NET ORM 分表分庫【到底】怎么做?
事務(wù)
關(guān)于事務(wù),我們寫了一篇專門介紹的文章,可跳轉(zhuǎn)查看:.NET 數(shù)據(jù)庫事務(wù)的各種玩法進化
寫在最后
FreeSql 2.0.0 他是免費自由的 ORM,也可以說是寶藏 ORM。更多文檔請前往 wiki 查看。
下一個五年,期待少年的你還能歸來在此貼回復,兌現(xiàn)五年不變的承諾。
多的不說了,希望民間的開源力量越來越強大。
希望作者的努力能打動到你,請求正在使用的、善良的您能動一動小手指,把文章轉(zhuǎn)發(fā)一下,讓更多人知道 .NET 有這樣一個好用的 ORM 存在。謝謝!!
FreeSql 使用最寬松的開源協(xié)議 MIT https://github.com/dotnetcore/FreeSql,完全可以商用,文檔齊全。QQ群:4336577(已滿)、8578575(在線)、52508226(在線)
總結(jié)
以上是生活随笔為你收集整理的.Net orm 开源项目 FreeSql 2.0.0的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程并发如何高效实现生产者/消费者?
- 下一篇: asp.net ajax控件工具集 Au