.NET Core:ORM使用之NPOCO

作者: 张蘅水 | 来源:发表于2017-03-13 22:51 被阅读3009次

一.简述

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 中国大陆许可协议
转载请注明:作者 张很水


我正在广州找一份 .Net 的工作,欢迎各位老板扫描我的QQ二维码洽谈

相关文章

网友评论

  • ca63f3eba032:马克下,看了下文档似乎不支持many to many

本文标题:.NET Core:ORM使用之NPOCO

本文链接:https://www.haomeiwen.com/subject/hcjqnttx.html