zoukankan      html  css  js  c++  java
  • 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);       //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

    关注公众号:UP技术控   获取更多资讯

  • 相关阅读:
    P4374 [USACO18OPEN]Disruption P
    POJ
    Git
    SpringBoot集成RabbitMQ
    GIS类型文件剖析
    SpringBoot全局异常处理
    SpringCloud Feign异常处理
    SpringBoot注解
    Restful风格接口定义
    LOD技术的理解
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/13967941.html
Copyright © 2011-2022 走看看