這是一篇純技術乾貨的分享文章,FreeSql 已經基本完成 .NETCore 最方便的 ORM 使命,咱們正在籌備生態的創建,好比 ABP 中如何使用 FreeSql 的實現,須要各類各樣的擴展包,好多好多工做量。有沒有大神願意無償參與作這件事情,好吧。。應該沒有人!!前端
大約是在三天前,由於使用 FreeSql 的某項目須要作一個簡單的後臺功能,以便錄入或管理數據。在實施的過程當中好懷念當初 dotnetGen 生成器的味道,用它產生 curd 基本功能幾乎是秒作;git
而後今天發表的 FreeSql.AdminLTE 主角,已經實現了相關功能,它是怎麼幹這個事情的,且看下面內容;github
它是 FreeSql 衍生出來的 .NETCore MVC 中間件擴展包,基於 AdminLTE 前端框架動態產生實體的增刪查改界面;sql
輸入:實體一、實體二、實體3c#
輸出:後臺管理的功能安全
只須要傳入實體,就能夠造成 curd 的管理功能,是否是有些騷啊~~~前端框架
先發一張運行後的圖片嚐個鮮:併發
這是根據實體產生 curd 界面的 mvc 中間件,開發時預覽數據好方便啊。看完預覽圖不禁得再感嘆一次 FreeSql 的易用性,那句口號:作 .NETCore 最方便的 ORM! 沒有說錯。。。做者屢次說起:「咱們是日式簡約風格,沒那麼複雜的用法」,也驗證了這一點。。mvc
中件間產生的界面包括添加、修改數據的功能,普通實體的根據屬性的類型與 Html5 UI 一一映射;app
比較特殊的映射規則:
c# 類型 | Html5 |
---|---|
布爾 | 複選框 |
枚舉 | 下拉選擇 |
日期 | 日期控件 |
ManyToOne 導航屬性 | 下拉選擇 |
ManyToMany 導航屬性 | 多選器 |
等等。。。
什麼狀況會產生【上傳文件】控件?
有興趣的能夠了解源碼,目前沒有開放在外部配置。
中件間爲每一個實體提供了分頁列表查詢,每頁爲20條數據;
除此外,還提供了過濾條件的支持,規則是根據導航屬性(ManyToOne、ManyToMany)。好比【文章實體】,內含有【分類id】+【分類對象】,則【文章】列表頁會出現按【分類】篩選的UI,詳見上面的 demo 示意圖,或者下載對應的 demo 版本運行;
中件間爲每一個實體提供了批量刪除的功能;
咱們習慣用 sqlite 作測試庫,測試完畢直接刪除目錄,不留垃圾數據,因此下面的 demo 不須要修改任何地方,運行時自動建庫、建表;
提供 .net core 2.一、2.2 兩種環境的測試 demo 下載:
Demo for dotnet 2.1.zip、Demo for dotnet 2.2.zip
第一步:
dotnet restore
第二步:
dotnet run
一番驚喜事後,你應該會考慮實用性,這樣作有什麼價值,可用於什麼樣的場景?
這個擴展包簡單的輸入,產生巨量的功能反饋。目前來講它是死板的,對外提供的擴展性幾乎爲零,這樣也就限定了它的應用場景。
一、它不可替代咱們自身開發的後臺管理系統;
二、它不適合擺放在公網正式環境,存在數據安全問題;
三、歡迎補充。。。;
目前的定位是這樣的,在開發環境中使用,查閱預覽實體數據,同時也比較方便的管理測試數據。
一段擁有無比力量的小段代碼,也是中間件界面的功能開啓:
//能夠配置子目錄訪問,如:/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)
github: