天天看點

ORM 開發環境之利器:MVC 中間件 FreeSql.AdminLTE

前言

這是一篇純技術幹貨的分享文章,FreeSql 已經基本完成 .NETCore 最友善的 ORM 使命,我們正在籌備生态的建立,比如 ABP 中如何使用 FreeSql 的實作,需要各種各樣的擴充包,好多好多工作量。有沒有大神願意無償參與做這件事情,好吧。。應該沒有人!!

大約是在三天前,因為使用 FreeSql 的某項目需要做一個簡單的背景功能,以便錄入或管理資料。在實施的過程中好懷念當初 dotnetGen 生成器的味道,用它産生 curd 基本功能幾乎是秒做;

然後今天發表的 FreeSql.AdminLTE 主角,已經實作了相關功能,它是怎麼幹這個事情的,且看下面内容;

功能介紹

它是 FreeSql 衍生出來的 .NETCore MVC 中間件擴充包,基于 AdminLTE 前端架構動态産生實體的增删查改界面;

輸入:實體1、實體2、實體3

輸出:背景管理的功能

隻需要傳入實體,就可以形成 curd 的管理功能,是不是有些騷啊~~~

先發一張運作後的圖檔嘗個鮮:

ORM 開發環境之利器:MVC 中間件 FreeSql.AdminLTE

這是根據實體産生 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

ORM 開發環境之利器:MVC 中間件 FreeSql.AdminLTE

第一步:

dotnet restore

第二步:

dotnet run

思考

一番驚喜過後,你應該會考慮實用性,這樣做有什麼價值,可用于什麼樣的場景?

這個擴充包簡單的輸入,産生巨量的功能回報。目前來說它是死闆的,對外提供的擴充性幾乎為零,這樣也就限定了它的應用場景。

不合适的場景

1、它不可替代我們自身開發的背景管理系統;

2、它不适合擺放在公網正式環境,存在資料安全問題;

3、歡迎補充。。。;

談談定位

目前的定位是這樣的,在開發環境中使用,查閱預覽實體資料,同時也比較友善的管理測試資料。

一段擁有無比力量的小段代碼,也是中間件界面的功能開啟:

//可以配置子目錄通路,如:/testadmin/
app.UseFreeAdminLTE("/",
    typeof(Entities.Song),
    typeof(Entities.Tag));
           

其他

ORM 開發環境之利器:MVC 中間件 FreeSql.AdminLTE

本次測試的實體有 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(線上)、52508226(線上)

github:

https://github.com/2881099/FreeSql

https://github.com/2881099/FreeSql.AdminLTE

繼續閱讀