一.简述
NPOCO做为PetaPoco的一个分支,虽然不像EF那样流行,当作为一款性能不错且支持表达式、映射、多数据库的轻量ORM还是值得学习的。
ORM性能对比,来自Dapper与其他orm的对比数据
二.连接
本文使用的数据库是Mysql(数据库脚本在这里),而NPoco除了支持Mssql,还支持MySQL, PostgreSQL, Oracle, Sqlite, SqlCE等数据库。
NPoco自身不带驱动,所以连接Mysql,需要引用Mysql的驱动。NPoco的使用IDatabase来管理连接和操作数据库,所以我们可以直接注入IDatabase。
services.AddScoped<IDatabase>(x =>
{
return new Database(Configuration.GetConnectionString("ConnectionStrings:Mysql"), DatabaseType.MySQL, MySql.Data.MySqlClient.MySqlClientFactory.Instance);
});
需要说明的一点,IDatabase继承IDisposable,在垃圾回收的时候会调用Dispose的方法关闭连接。所以,如果是使用了仓储模式,手动打开了连接后需要记得关闭。
三.模型映射
NPoco支持两种方法映射:Fluent和直接在类中属性映射。
在这里我们使用简单方便的属性映射:
示例类映射
[TableName] 、[Column]分别代表表名和字段名。
[PrimaryKeys]是声明主键,复合主键的时候需要用逗号隔开,默认是自增的。如果不注意,对于非自增的主键会造成插入的主键为空,导致插入失败。
[Ignore]此属性将被忽略,并且无法映射到。
**[ResultColumn] ** 需要在SQL中显式指定,但是不会包含在插入或更新中。
[ComputedColumn] 具有计算列属性的属性的工作方式与结果列属性相同,但它们将在SQL中自动选择
四.增删改查
为了方便查询和执行,我在这里对IDatabase写了几个比较常见的扩展方法,
1.插入
插入最简单,直接传入一个对应的模型就行了,默认返回的是该模型映射的主键,下图可以看到返回的主键为1.
插入
2.删
默认有个删除的方法是针对主键的,然而基于表达式,根据其他字段来删除,我们可以写这样的一个扩展方法:
删除的扩展方法
删除的控制器
如果我们要批量删除,只要改一下表达式就可以了,如上图中注释的表达式就为转换为SQL的In语句,
删除的返回结果
3.改
官方默认的方法为先找出对应主键的模型,然后给模型的对应属性赋新值,最后保存。结果可能是插入或者更新一个存在的结果。对应的,我也写了一个扩展方法,可以在where中写表达式,在onlyFields中只更新需要更新的字段。
更新的扩展方法
更新控制器调用方法
更新的结果
4.分页
基于表达式,我们可以很方便地拼接不同的查询条件,如下图的参数模型,除了页码和分页大小,其他
参数都是
可空的。
参数模型
由于分页的查询条件复杂一些,涉及到排序,所以我这里只封装了一个限制条件的方法,基于这个方法可以实现灵活的排序策略。
分页表达式构造方法
怎么构造表达式才是成功的一半,基于布尔逻辑(试下去掉括号会有怎样的效果?),我们可以构造灵活的表达式,如下图:
控制器表达式
上图中可以看出,对比sql的拼接参数,这样的书写方式更简洁易懂。
无条件的分页
id限制的分页
id和name限制的分页
五.最后说几句话
由于时间仓促,我就没测试生成的查询语句,但之前使用postgresql的时候,生成的查询语句还是比较让我满意的。这里只是对Npoco做简单的介绍和封装,更多内容还是要参考WIKI。
由于不同数据库的差异,和部分表达式可能没实现,如果用于生产,切记测试。
dotnet core 学习小组
本文采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
转载请注明:作者 张蘅水