批量操作(插入、更新、删除、读取、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