EntityFrameworkCore扩展-EFCore.BulkExtensions

  • A+
所属分类:.NET技术
摘要

批量操作(插入、更新、删除、读取、Upsert、Sync、Truncate)和批处理操作(删除、更新)。

批量操作(插入、更新、删除、读取、Upsert、Sync、Truncate)和

批处理操作(删除、更新)。

这个库是轻量级的,并且非常高效,其中大部分都使用CRUD操作。

在微软推荐的前20个EF核心扩展中被选中。

当前版本使用的是efcore3.1,目前支持microsoftsqlserver(2008+)和SQLite。

它的目标是netstandard2.0,因此可以用于NetCore(2.0+)或NetFramework(4.6.1+)的项目。

3.1.0和3.0.0之间的版本使用EF Core 3.0,目标是NetStandard 2.1,因此只能在NetCore(3.0+)上使用。

3.0之前的版本(最新的2.6.4)以NetStandard 2.0为目标,可与NetCore(2.2)或NetFramework(4.6.1+)一起使用。

EFCore/v.Nuget:EFCore2.1/v2.4.1efcore2.0/v2.0.8,efcore1.x使用1.1.0(针对netstandard1.4)

对于bulkcopy/Insert,在bulkcopy和sqlupdate下结合使用。

对于SQLite,没有大容量复制,相反,库使用普通SQL和UPSERT相结合。

批量测试不能具有UseInMemoryDb,因为InMemoryProvider不支持特定于关系的方法。

在NuGet最新版本上提供。

用于安装的包管理器控制台命令:Install PackageEFCore.BulkExtensions

使用

它非常简单明了。

在DbContext类上进行大容量扩展,可以这样使用(支持常规和异步方法):

context.BulkInsert(entitiesList);                 context.BulkInsertAsync(entitiesList); context.BulkUpdate(entitiesList);                 context.BulkUpdateAsync(entitiesList); context.BulkDelete(entitiesList);                 context.BulkDeleteAsync(entitiesList); context.BulkInsertOrUpdate(entitiesList);         context.BulkInsertOrUpdateAsync(entitiesList);       //Upsert context.BulkInsertOrUpdateOrDelete(entitiesList); context.BulkInsertOrUpdateOrDeleteAsync(entitiesList); //Sync context.BulkRead(entitiesList);                   context.BulkReadAsync(entitiesList); context.Truncate<Entity>();                       context.TruncateAsync<Entity>(); 

  

批处理扩展是在IQueryable DbSet上进行的,可以在下面的代码段中使用。

它们是作为纯sql执行的,不检查是否有一些预先加载到内存中并且正在被跟踪。(updateColumns是可选参数,当我们需要更新到它的默认值时,PropertyNames在其中显式添加)

Delete context.Items.Where(a => a.ItemId >  500).BatchDelete(); context.Items.Where(a => a.ItemId >  500).BatchDeleteAsync();  // Update (using Expression arg.) supports Increment/Decrement  context.Items.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });   // can be as value '+100' or as variable '+incrementStep' (int incrementStep = 100;)    // Update (via simple object) context.Items.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" }); context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" }); // Update (via simple object) - requires additional Argument for setting to Property default value var updateColumns = new List<string> { nameof(Item.Quantity) }; // Update 'Quantity' to default value('0'-zero) var q = context.Items.Where(a => a.ItemId <= 500); int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);//result assigned to variable 

  

批量信息

如果使用Windows身份验证,那么在ConnectionString中应该有Trusted_Connection=True;因为需要Sql凭据才能保持连接。

当直接使用时,这些操作都是独立的事务,并自动提交。

如果我们需要在一个过程中进行多个操作,那么应该使用显式事务。

例如,由于子表不是与父表一起自动插入的,因此需要显式的第二次调用:

using (var transaction = context.Database.BeginTransaction()) {     context.BulkInsert(entitiesList);     context.BulkInsert(subEntitiesList);     transaction.Commit(); } 

  

当两个操作都需要时,可以使用BulkInsertOrUpdate方法,但需要一个到数据库的连接。

当PK(PrimaryKey)匹配时更新,否则插入。

BulkInsertOrUpdateOrDelete有效地将表行与输入数据同步。

数据库中未在列表中找到的将被删除。

BulkRead确实根据配置UpdateByProperties中指定的一个或多个唯一列进行选择和联接。

更多信息请看下面地址。

https://github.com/borisdj/EFCore.BulkExtensions