前言
這是一篇純技術干貨的分享文章,FreeSql 已經基本完成 .NETCore 最方便的 ORM 使命,我們正在籌備生態的建立,比如 ABP 中如何使用 FreeSql 的實現,需要各種各樣的擴展包,好多好多工作量。有沒有大神願意無償參與做這件事情,好吧。。應該沒有人!!
大約是在三天前,因為使用 FreeSql 的某項目需要做一個簡單的后台功能,以便錄入或管理數據。在實施的過程中好懷念當初 dotnetGen 生成器的味道,用它產生 curd 基本功能幾乎是秒做;
然后今天發表的 FreeSql.AdminLTE 主角,已經實現了相關功能,它是怎么干這個事情的,且看下面內容;
功能介紹
它是 FreeSql 衍生出來的 .NETCore MVC 中間件擴展包,基於 AdminLTE 前端框架動態產生實體的增刪查改界面;
輸入:實體1、實體2、實體3
輸出:后台管理的功能
只需要傳入實體,就可以形成 curd 的管理功能,是不是有些騷啊~~~
先發一張運行后的圖片嘗個鮮:
這是根據實體產生 curd 界面的 mvc 中間件,開發時預覽數據好方便啊。看完預覽圖不由得再感嘆一次 FreeSql 的易用性,那句口號:做 .NETCore 最方便的 ORM! 沒有說錯。。。作者多次提及:“我們是日式簡約風格,沒那么復雜的用法”,也驗證了這一點。。
添加/修改
中件間產生的界面包括添加、修改數據的功能,普通實體的根據屬性的類型與 Html5 UI 一一映射;
比較特殊的映射規則:
c# 類型 | Html5 |
---|---|
布爾 | 復選框 |
枚舉 | 下拉選擇 |
日期 | 日期控件 |
ManyToOne 導航屬性 | 下拉選擇 |
ManyToMany 導航屬性 | 多選器 |
等等。。。
什么情況會產生【上傳文件】控件?
有興趣的可以了解源碼,目前沒有開放在外部配置。
查詢/過濾
中件間為每個實體提供了分頁列表查詢,每頁為20條數據;
除此外,還提供了過濾條件的支持,規則是根據導航屬性(ManyToOne、ManyToMany)。比如【文章實體】,內含有【分類id】+【分類對象】,則【文章】列表頁會出現按【分類】篩選的UI,詳見上面的 demo 示意圖,或者下載對應的 demo 版本運行;
刪除
中件間為每個實體提供了批量刪除的功能;
測試 demo
我們習慣用 sqlite 做測試庫,測試完畢直接刪除目錄,不留垃圾數據,所以下面的 demo 不需要修改任何地方,運行時自動建庫、建表;
提供 .net core 2.1、2.2 兩種環境的測試 demo 下載:
Demo for dotnet 2.1.zip、Demo for dotnet 2.2.zip
第一步:
dotnet restore
第二步:
dotnet run
思考
一番驚喜過后,你應該會考慮實用性,這樣做有什么價值,可用於什么樣的場景?
這個擴展包簡單的輸入,產生巨量的功能反饋。目前來說它是死板的,對外提供的擴展性幾乎為零,這樣也就限定了它的應用場景。
不合適的場景
1、它不可替代我們自身開發的后台管理系統;
2、它不適合擺放在公網正式環境,存在數據安全問題;
3、歡迎補充。。。;
談談定位
目前的定位是這樣的,在開發環境中使用,查閱預覽實體數據,同時也比較方便的管理測試數據。
一段擁有無比力量的小段代碼,也是中間件界面的功能開啟:
//可以配置子目錄訪問,如:/testadmin/
app.UseFreeAdminLTE("/",
typeof(Entities.Song),
typeof(Entities.Tag));
其他
本次測試的實體有 versionRow 字段(樂觀鎖),當不修改內容時,點按鈕后不會執行SQL。
如何判定?可以回到列表,看 versionRow 的值沒變化,如果執行了SQL,它的值會增加。
不執行 SQL 有啥單獨可說的?這就牽連到 FreeSql.DbContext 了,是它過濾了執行操作,有興趣可移步了解;
樂觀鎖
FreeSql (樂觀鎖)說明:
更新整個實體數據時,在並發情況下極容易造成舊數據將新的記錄更新。
行級鎖的原理,是利用實體某字段,如:long version,更新前先查詢數據,此時 version 為 1,更新時產生的 SQL 會附加 where version = 1,當修改失敗時(即 Affrows == 0)拋出異常。
每個實體只支持一個行級鎖屬性,在屬性前標記特性:[Column(IsVersion = true)] 即可。
適用 SetSource 更新,每次更新 version 的值都會增加 1
收官
FreeSql.AdminLTE 目前已經定版了,差不多已經把 dotnetGen 支持的功能都遷移了過來,完成了它應有的職責定位。
下一個擴展包也非常有意思,歡迎持續關注我們,做 .NETCore 最方便的 ORM !
QQ群:4336577(已滿)、8578575(在線)
github: