EntityFrameworkCore扩展-EFCore.BulkExtensions

批量操作(插入、更新、删除、读取、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);       //Upsertcontext.BulkInsertOrUpdateOrDelete(entitiesList); context.BulkInsertOrUpdateOrDeleteAsync(entitiesList); //Synccontext.BulkRead(entitiesList);                   context.BulkReadAsync(entitiesList);context.Truncate<Entity>();                       context.TruncateAsync<Entity>();

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

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

 

Deletecontext.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 valuevar 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18e8e27b] 2023-07-22 09:35:58.167 ERROR 44888 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: com.sc_core.hardware.entity.Bracelet cannot be cast to com.sc_core.hardware.entity.BraceletMessage] with root cause java.lang.ClassCastException: com.sc_core.hardware.entity.Bracelet cannot be cast to com.sc_core.hardware.entity.BraceletMessage at com.sc_core.hardware.service.Impl.BraceletServiceImpl.BraceletOnlineCount(BraceletServiceImpl.java:46) ~[classes/:na] at com.sc_core.hardware.controller.BraceletController.BraceletOnlineCount(BraceletController.java:37) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.46.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.46.jar:4.0.FR]
最新发布
07-23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值