ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EntityFrameworkCore扩展-EFCore.BulkExtensions

2020-11-13 10:33:52  阅读:248  来源: 互联网

标签:ItemId EFCore Where entitiesList EntityFrameworkCore context 使用 Items BulkExtens


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

标签:ItemId,EFCore,Where,entitiesList,EntityFrameworkCore,context,使用,Items,BulkExtens
来源: https://www.cnblogs.com/lyl6796910/p/13967941.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有