FreeSql 通過半年的開發和堅持維護,在 0.6.x 版本中完成了幾大重要事件:html
一、按小包拆分,每一個數據庫實現爲單獨 dll;mysql
二、實現 .net framework 4.5 支持;git
三、同時支持 MySql.Data、MySqlConnector 的實現;github
四、自定義導航屬性關係的配置;web
五、配套工具 FreeSql.Tools 發佈;sql
本文主要講解第5項,大主角每每在最後纔出現!!!數據庫
在此以前一直被吐槽 FreeSql 臃腫,沒有小包開發理念。其實我是一點也不認可這種評價,雖然剛開發只有一個 FreeSql.dll,可是在開發和規劃上簡單了不少。c#
有一條開發原則講道:過早優化是惡夢!ide
大概意思是不管作什麼項目,不要想着一開始就過分系統的、規範的執行。從外界來看是正規了,可是進度和穩定性會大大折扣。能夠不信我,可是請必定要相信前人的總結啊!!!工具
從以前的一個 dll 到拆分紅小包,咱們總共耗時兩天,雖然都在一個項目內開發,但其實耦合性並不高。
車到山前必有路,時機到了天然會拆。這個時機也是奠基 FreeSql 走出了穩定關鍵的一步。這樣就會有更多人願意加入 FreeSql 陣營。
早期 FreeSql 主要是在 .net core 最方便的 ORM!NETStandard 是新的標準,然而前段時間微軟又說 ..net5 將合併。。。變化真的太快。
在實現拆分小包後,其實 FreeSql 的模塊更加清淅,而且依賴項很是之少,而後比較容易的作出了 4.5 framework 的適配。
目前支持的版本:
Package Name | Version |
---|---|
FreeSql.Provider.MySql | NETStandard2.0、net452 |
FreeSql.Provider.PostgreSQL | NETStandard2.0、net45 |
FreeSql.Provider.SqlServer | NETStandard2.0、net451 |
FreeSql.Provider.Sqlite | NETStandard2.0、net45 |
FreeSql.Provider.Oracle | NETStandard2.0、net45 |
FreeSql.Extensions.LazyLoading | NETStandard2.0、net45 |
mysql 是一個神奇的流行數據庫,在 .net 陣營中使用量排名老二。mysql 的版本五花八門,從 5.6 開始有了不一樣的分支,分支的出現使得 ado.net 驅動不通用。
不少人不推薦使用 MySql.Data 官方驅動,可是 FreeSql 一直在使用官驅,而且支持了全部 5.6 類型,包括 enum/set 等。
而後就有一些人,特別是高手的那些來提出要求,適配一個 MySqlConnector 的實現,而後著名的 A大(茶叔)提了一道 PR ,建立了 FreeSql.Provider.MySqlConnector 項目,99.9999% 源碼和原來 FreeSql.Provider.MySql 相同,通過 266 個單元測試後發現,只須要兼容 enum/set 類型,參數化 ? @ 的處理就跑通了。而後就有了如今新的驅動包:
Package Name | Version |
---|---|
FreeSql.Provider.MySqlConnector | NETStandard2.0、net45 |
而後 FreeSqlBuilder 使用反射決定使用哪一個 mysql 驅動。代碼以下:
public IFreeSql<TMark> Build<TMark>() { if (string.IsNullOrEmpty(_masterConnectionString)) throw new Exception("參數 masterConnectionString 不可爲空,請檢查 UseConnectionString"); IFreeSql<TMark> ret = null; Type type = null; switch(_dataType) { case DataType.MySql: type = Type.GetType("FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySql")?.MakeGenericType(typeof(TMark)); if (type == null) type = Type.GetType("FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySqlConnector")?.MakeGenericType(typeof(TMark)); if (type == null) throw new Exception("缺乏 FreeSql 數據庫實現包:FreeSql.Provider.MySql.dll,可前往 nuget 下載"); break; case DataType.SqlServer: type = Type.GetType("FreeSql.SqlServer.SqlServerProvider`1,FreeSql.Provider.SqlServer")?.MakeGenericType(typeof(TMark)); if (type == null) throw new Exception("缺乏 FreeSql 數據庫實現包:FreeSql.Provider.SqlServer.dll,可前往 nuget 下載"); break; case DataType.PostgreSQL: type = Type.GetType("FreeSql.PostgreSQL.PostgreSQLProvider`1,FreeSql.Provider.PostgreSQL")?.MakeGenericType(typeof(TMark)); if (type == null) throw new Exception("缺乏 FreeSql 數據庫實現包:FreeSql.Provider.PostgreSQL.dll,可前往 nuget 下載"); break; case DataType.Oracle: type = Type.GetType("FreeSql.Oracle.OracleProvider`1,FreeSql.Provider.Oracle")?.MakeGenericType(typeof(TMark)); if (type == null) throw new Exception("缺乏 FreeSql 數據庫實現包:FreeSql.Provider.Oracle.dll,可前往 nuget 下載"); break; case DataType.Sqlite: type = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(typeof(TMark)); if (type == null) throw new Exception("缺乏 FreeSql 數據庫實現包:FreeSql.Provider.Sqlite.dll,可前往 nuget 下載"); break; default: throw new Exception("未指定 UseConnectionString"); } ret = Activator.CreateInstance(type, new object[] { _masterConnectionString, _slaveConnectionString }) as IFreeSql<TMark>; if (ret != null) { ret.CodeFirst.IsAutoSyncStructure = _isAutoSyncStructure; ret.CodeFirst.IsSyncStructureToLower = _isSyncStructureToLower; ret.CodeFirst.IsSyncStructureToUpper = _isSyncStructureToUpper; ret.CodeFirst.IsConfigEntityFromDbFirst = _isConfigEntityFromDbFirst; ret.CodeFirst.IsNoneCommandParameter = _isNoneCommandParameter; ret.CodeFirst.IsLazyLoading = _isLazyLoading; var ado = ret.Ado as Internal.CommonProvider.AdoProvider; ado.AopCommandExecuting += _aopCommandExecuting; ado.AopCommandExecuted += _aopCommandExecuted; } return ret; }
FreeSql 原先支持約定式導航關係配置,對於新項目開發無疑可約定,可是不少老項目命名不規範的就使用不了相關的功能。
有關約定配置可參考 github wiki 中心文檔
QQ 開發羣真是個好平臺,在發起討論後,各位大佬都紛紛提出建議,最後以一票否決了各大建議,哈哈。。
主要從語法和用戶使用的感覺上設計,仍是那個理念:日式簡約!不能加入太多特性和功能,增長用戶的理解和使用成本。
最終效果以下:
//導航屬性,OneToMany [Navigate("Song_id")] public virtual List<song_tag> Obj_song_tag { get; set; } //導航屬性,ManyToOne/OneToOne [Navigate("Song_id")] public virtual song Obj_song { get; set; } [Navigate("Tag_id")] public virtual tag Obj_tag { get; set; }
而後就能使用不少導航的騷操做功能了。
在此感謝這個工具的做者:mypeng1985,和參考者:movingsam
感謝有大家一幫熱心的使用者,幫助 FreeSql 生態添磚加瓦!!
FreeSql 在早期作過一套生成器模板,功能比較隱祕,通常人不知道如何使用。。以後就一直沉迷於 CodeFirst 的功能開發,沒法自拔。
而後在10天前,忽然感受 FreeSql 多了好多使用者,這個時間固然須要有從數據庫生成實體的需求了!!
Q:不必搞這種東西了吧 市面上蠻多的,或者搞一套模板徹底搞定了?
A:
沒法100%類型兼容啊,由於 FreeSql 支持的類型真的深,而後市場上的類型映射作不到 100% 匹配;
爲了挖掘更多功能,生成器還須要有導航屬性的支持,這是基本的,由於有導航屬性後,FreeSql 操做會騷許多;
原本我發起了一個純 winform 的生成器項目,界面都作好了以下:
是否是以爲很好看?我以爲好看。。。。其餘人以爲醜。我在開發羣發給你們看了以後,次日 FreeSql.Tools 項目就搞出了新的界面,以下:
直接被秒殺了,這是來自做者:mypeng1985 的佳做。
界面看上去很是像 web,但其實不是的,仍然是一個 winform 程序,使用了 html 作界面,c# 作操做功能。
源碼地址:https://github.com/2881099/FreeSql.Tools
FreeSql 從 2018年11月28日立項,開發,到今天 0.6.x,單元測試 1600+,生態也逐漸完善,有獲得許多網友的鼓勵和支持,感謝大家!感謝參與項目的大家!
原文出處:https://www.cnblogs.com/FreeSql/p/10975776.html