2018年11月頭腦發熱到今天,一晃已經兩年,當初從舒服區走向一個巨大的坑,回頭一看後背一涼。html
兩年時間從無到有,經歷數不清的日夜奮鬥(有人問花了多長時間投入,答案:全職x2 + 兩年無休息)。mysql
今天 FreeSql 已經很強大,感謝第一批、第二批、第N批持續提出建議的朋友,總算給社區交了一個滿意答卷。git
v2.0.0 是一個穩定的版本,主要體現:github
感嘆:有些人說 .Net 陷入 orm 怪圈,動手的沒幾個,指點江山的一堆,.Net orm 真的如他們所講的簡單嗎?sql
舒適提醒:如下內容無商吹成份,FreeSql 不打誑語數據庫
舒適提醒:如下內容無商吹成份,FreeSql 不打誑語c#
舒適提醒:如下內容無商吹成份,FreeSql 不打誑語bash
FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及還有說不出來的運行平臺,由於代碼綠色無依賴,支持新平臺很是簡單。目前單元測試數量:5400+,Nuget下載數量:260K+,源碼幾乎天天都有提交。值得高興的是 FreeSql 加入了 ncc 開源社區:https://github.com/dotnetcore/FreeSql,加入組織以後社區責任感更大,須要更努力作好品質,爲開源社區出一份力。app
QQ羣:4336577(已滿)、8578575(在線)、52508226(在線)ide
爲何要重複造輪子?
FreeSql 主要優點在於易用性上,基本是開箱即用,在不一樣數據庫之間切換兼容性比較好。做者花了大量的時間精力在這個項目,肯請您花半小時瞭解下項目,謝謝。FreeSql 總體的功能特性以下:
5500+個單元測試做爲基調,支持10多數數據庫,咱們提供了通用Odbc理論上支持全部數據庫,目前已知有羣友使用 FreeSql 操做華爲高斯、mycat、tidb 等數據庫。
安裝時選擇對應的數據庫包:
dotnet add packages FreeSql.Provider.MySql
FreeSql 使用 CodeFirst 模式開發,簡直不要再簡單,只須要以下定義:
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) //自動同步實體結構到數據庫 .UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText + "\r\n")) //打印 SQL .Build(); //請務一定義成 Singleton 單例模式
UseAutoSyncStructure(true) 這個設置開啓自動遷移功能,啥意思?以下實體類:
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();
會執行 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,1 SELECT a.`BlogId`, a.`Url`, a.`Rating` FROM `Blog` a limit 0,1
程序運行過程當中,首次 CRUD 操做實體類會建立表,以後再也不執行該操做。
這是表不存在的狀況,若是表存在的時候會怎樣?會對比更新結構。FreeSql 對比表結構和實體類的差別部分,執行遷移儘可能保證不丟數據(沒法100%保證,請三思使用在生產環境)
除了自動遷移功能,咱們還提供以幾個經常使用 API fsql.CodeFirst 方法:
方法 | 返回值 | 參數 | 說明 |
---|---|---|---|
GetComparisonDDLStatements | string | Type | 將實體類型與數據庫對比,返回DDL語句 |
SyncStructure | bool | Type | 同步實體類型到數據庫 |
ConfigEntity | ICodeFirst | Action<TableFluent<T>> | FluentAPI 配置實體的特性 |
GetTableByEntity | TableInfo | Type | 獲取類型在ORM內部的元數據 |
.NET ORM 幾乎都是經過實體與表進行映射,怎麼少得了靈活的特性設置呢。
提示: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 設置實體類與數據庫小寫映射,其實還提供統一處理的方法:
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 // 感謝【曉晨】提供的這個思路和功能
FreeSql CRUD 命名習慣聽從 SQL,代碼寫起來就像寫 SQL 同樣,以下:
FreeSql.Repository 做爲擴展,實現了通用倉儲層功能。與其餘規範標準同樣,倉儲層也有相應的規範定義。FreeSql.Repository 參考 abp vnext 接口,定義和實現基礎的倉儲層(CURD),應該算比較通用的方法吧。倉儲能夠:
微軟製造了優秀的語言 c#,利用語言特性能夠作一些很是好用的功能,在 ORM 中使用導航屬性很是適合。
FreeSql ManyToOne(N對1) 提供了簡單的多表 join 查詢;
FreeSql OneToMany(1對N) 提供了簡單可控的級聯查詢、級聯保存功能;
FreeSql ManyToMany(多對多) 提供了簡單的多對多過濾查詢、級聯查詢、級聯保存功能;
FreeSql 父子關係 提供了經常使用的 CTE查詢、刪除、遞歸功能;
關於導航屬性,咱們寫了一篇專門介紹的文章,可跳轉查看:.NET ORM 導航屬性【到底】能夠解決什麼問題?
關於分表分庫,咱們寫了一篇專門介紹的文章,可跳轉查看:.NET ORM 分表分庫【到底】怎麼作?
關於事務,咱們寫了一篇專門介紹的文章,可跳轉查看:.NET 數據庫事務的各類玩法進化
FreeSql 2.0.0 他是免費自由的 ORM,也能夠說是寶藏 ORM。更多文檔請前往 wiki 查看。
下一個五年,期待少年的你還能歸來在此貼回覆,兌現五年不變的承諾。
多的不說了,但願民間的開源力時愈來愈強大。
但願做者的努力能打動到你,請求正在使用的、善良的您能動一動小手指,把文章轉發一下,讓更多人知道 .NET 有這樣一個好用的 ORM 存在。謝謝!!
FreeSql 使用最寬鬆的開源協議 MIT https://github.com/dotnetcore/FreeSql,徹底能夠商用,文檔齊全。QQ羣:4336577(已滿)、8578575(在線)、52508226(在線)