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.zipDemo 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)

github:

https://github.com/2881099/FreeSql

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

相关推荐