欢迎访问欧博网址!

万博体育手机登录网页 :C# 数据操作系列 - 18 让Dapper更强的插件

欧博网址2周前7

0. 前言

在前一篇中我们讲到了Dapper的应用,然则给我们的感受Dapper不像个ORM更像一个IDbConnection的扩展。是的,没错。在现实开发中我们经常用Dapper作为对EF Core的弥补。固然了Dapper并不仅仅只有这些,就让我们通过这一篇文章去让Dapper更像一个ORM吧。

1. Dapper Contrib

Dapper Contrib 扩展了Dapper对于实体类的CRUD方式:

安装方式:

命令行:

dotnet add package Dapper.Contrib

NuGet:

Install-Package Dapper.Contrib

使用:

using Dapper.Contrib.Extensions;

这个是一个使得Dapper功效更壮大的扩展包,由于支持了CRUD,以是需要对实体类添加设置,该扩展包使用Attribute作为依据举行相关映射设置:

[Table("Model")]
public class Model
{
    [Key]
    [ExplicitKey]
    public int Id{get;set;}
    [Computed]
    public int Count {get;set;}
    [Write]
    public String Name{get;set;}
}

这是所有的设置,Table用来声明是一个表,必须指定表名,Key示意该属性是数据库主键,ExplicitKey示意这个属性是数据库中显示设置的主键,Computed示意该字段是一个盘算字段,Write示意该字段可以设置值进去。需要注重的是: Key和ExplicitKey这两个不能同时标注在一个属性上。

那么接下来,我们看看它扩展了哪些方式:

插入单个工具:

public static long Insert<T>(this IDbConnection connection, T entityToInsert, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

其中 transcation示意事务,若是指定事务,数据的提交将由事务控制,该方式会返回插入工具的主键(若是工具主键是数字类型)或者返回一个待插入列表中已插入的行数。

获取单个工具:

public static T Get<T>(this IDbConnection connection, [Dynamic] dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

通过传入主键,获取一个数据

获取所有数据:

public static IEnumerable<T> GetAll<T>(this IDbConnection connection, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

更新数据:

Dapper Contrib 提供了一个用来更新的方式:

public static bool Update<T>(this IDbConnection connection, T entityToUpdate, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

这个方式对照有意思的是

var entity = connection.Get<Model>(1);
entity.Name = "测试1";
connection.Update(entity);

var models = connection.GetAll<Model>();
foreach(var m in models)
{
    Console.WriteLine(m);
    m.StringLength ++;
}
connection.Update(models.AsList());

都可以,并不会报错。

不外需要注重的是,若是需要更新的实例没有指定主键值(主减属性没有赋值),则不会有任何行发生更新。而且在更新的时刻,会更新所有列,不会由于不赋值就不更新。

删除方式有两个:

public static bool Delete<T>(this IDbConnection connection, T entityToDelete, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;
public static bool DeleteAll<T>(this IDbConnection connection, IDbTransaction transaction = null, int? commandTimeout = null) where T : class;

删除也是传入一个实体类,一样也只是需要主键有值,若是没有找到主键对应的数据,则不会有任何转变。Delete与Update一样,若是传入一个List聚集也是可以的。

2. Dapper Transaction

这个包扩展了Dapper的事务处置能力。虽然是Dapper的扩展包,然则是给IConnection添加了一个扩展方式。使用示例如下:

dotnet add package Dapper.Transaction

老例子,记得先把包加进来。

然后代码是这样的:

using Dapper.Transaction;
using(var connection = new SqliteConnection("Data Source=./demo.db"))
{
    connection.Open();
    var transcation = connection.BeginTransaction();
    // 编写营业代码
    transcation.Commit();
}

若是使用Dapper Transaction,需要先挪用 connection.Open()来确保毗邻是开启状态。

transcation这个工具可以当做通俗的DbTranscation工具,传给Dapper的方式来使用,也可以当做一个开启了事务的Dapper客户端来使用。也就是说,Dapper对IDbConnection扩展的方式,在这个包对IDbTranscation也扩展了响应的方式:

3. Dapper Plus

这个插件是Dapper上用来处置巨量数据的插件,但这是个收费版的插件,不外每个月都有一定的试用限期。想试试的可以下一下:

dotnet add package Z.Dapper.Plus

使用:

using Z.Dapper.Plus;

这个插件在使用之前需要先设置实体类与数据库之间的映射关系:

DapperPlusManager.Entity<Customer>().Table("Customers");
DapperPlusManager.Entity<Supplier>().Table("Suppliers").Identity(x => x.SupplierID);

该插件支持四组大批量处置方式:

  • Bulk Insert
  • Bulk Update
  • Bulk Merge
  • Bulk Delete
// STEP MAPPING
DapperPlusManager.Entity<Supplier>().Table("Suppliers").Identity(x => x.SupplierID);
DapperPlusManager.Entity<Product>().Table("Products").Identity(x => x.ProductID);

// STEP BULKINSERT
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkInsert(suppliers).ThenForEach(x => x.Products.ForEach(y => y.SupplierID =  x.SupplierID)).ThenBulkInsert(x => x.Products);
}

// STEP BULKUPDATE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkUpdate(suppliers, x => x.Products);
}

// STEP BULKMERGE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkMerge(suppliers).ThenForEach(x => x.Products.ForEach(y => y.SupplierID =  x.SupplierID)).ThenBulkMerge(x => x.Products);
}

// STEP BULKDELETE
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
    connection.BulkDelete(suppliers.SelectMany(x => x.Products)).BulkDelete(suppliers);
}

4. 总结

这些插件让Dapper更强,也更具备一个完整的ORM的方式,固然现实开发中需要结合现实需求使用。可能并不是所有的都合适。

Dapper的内容就到此为止了。原本预计下一篇最先 asp.net core的内容,不外有个小伙伴推荐了FreeSql,我看了下感受挺不错的,就给小伙伴们先容一下~这一个先容完成之后,就进入了我期待已久的asp.net core系列了。

更多内容烦请关注我的博客《高先生小屋》

,

Allbet Gaming

www.xiangxiren12.com欢迎进入欧博平台网站(Allbet Gaming),Allbet Gaming开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博真人游戏(百家乐)等业务。

上一篇 下一篇

猜你喜欢

最新文章
热门文章
热评文章
随机文章
热门标签