.NET Core:ORM使用之NPOCO

一.简述

NPOCO做为PetaPoco的一个分支,虽然不像EF那样流行,当作为一款性能不错且支持表达式、映射、多数据库的轻量ORM还是值得学习的。

《.NET Core:ORM使用之NPOCO》 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和直接在类中属性映射
在这里我们使用简单方便的属性映射:

《.NET Core:ORM使用之NPOCO》 示例类映射

[TableName] 、[Column]分别代表表名和字段名。
[PrimaryKeys]是声明主键,复合主键的时候需要用逗号隔开,默认是自增的。如果不注意,对于非自增的主键会造成插入的主键为空,导致插入失败。
[Ignore]此属性将被忽略,并且无法映射到。
**[ResultColumn] ** 需要在SQL中显式指定,但是不会包含在插入或更新中。
[ComputedColumn] 具有计算列属性的属性的工作方式与结果列属性相同,但它们将在SQL中自动选择

四.增删改查

为了方便查询和执行,我在这里对IDatabase写了几个比较常见的扩展方法,
1.插入
插入最简单,直接传入一个对应的模型就行了,默认返回的是该模型映射的主键,下图可以看到返回主键为1.

《.NET Core:ORM使用之NPOCO》 插入

2.删

默认有个删除的方法是针对主键的,然而基于表达式,根据其他字段来删除,我们可以写这样的一个扩展方法:

《.NET Core:ORM使用之NPOCO》 删除的扩展方法

《.NET Core:ORM使用之NPOCO》 删除的控制器

如果我们要批量删除,只要改一下表达式就可以了,如上图中注释的表达式就为转换为SQL的In语句,

《.NET Core:ORM使用之NPOCO》 删除的返回结果

3.改
官方默认的方法为先找出对应主键的模型,然后给模型的对应属性赋新值,最后保存。结果可能是插入或者更新一个存在的结果。对应的,我也写了一个扩展方法,可以在where中写表达式,在onlyFields中只更新需要更新的字段。

《.NET Core:ORM使用之NPOCO》 更新的扩展方法

《.NET Core:ORM使用之NPOCO》 更新控制器调用方法

《.NET Core:ORM使用之NPOCO》 更新的结果

4.分页

基于表达式,我们可以很方便地拼接不同的查询条件,如下图的参数模型,除了页码和分页大小,其他
参数都是
可空的。

《.NET Core:ORM使用之NPOCO》 参数模型

由于分页的查询条件复杂一些,涉及到排序,所以我这里只封装了一个限制条件的方法,基于这个方法可以实现灵活的排序策略。

《.NET Core:ORM使用之NPOCO》 分页表达式构造方法

怎么构造表达式才是成功的一半,基于布尔逻辑(试下去掉括号会有怎样的效果?),我们可以构造灵活的表达式,如下图:

《.NET Core:ORM使用之NPOCO》 控制器表达式

上图中可以看出,对比sql的拼接参数,这样的书写方式更简洁易懂。

《.NET Core:ORM使用之NPOCO》 无条件的分页
《.NET Core:ORM使用之NPOCO》 id限制的分页
《.NET Core:ORM使用之NPOCO》 id和name限制的分页

五.最后说几句话
由于时间仓促,我就没测试生成的查询语句,但之前使用postgresql的时候,生成的查询语句还是比较让我满意的。这里只是对Npoco做简单的介绍和封装,更多内容还是要参考WIKI
由于不同数据库的差异,和部分表达式可能没实现,如果用于生产,切记测试。

《.NET Core:ORM使用之NPOCO》 dotnet core 学习小组

本文采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
转载请注明:作者 张蘅水

    原文作者:张蘅水
    原文地址: https://www.jianshu.com/p/8d9e079f38f5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞