EntityFrameworkCore擴展-EFCore.BulkExtensions

批量操做(插入、更新、刪除、讀取、Upsert、Sync、Truncate)和git

批處理操做(刪除、更新)。github

這個庫是輕量級的,而且很是高效,其中大部分都使用CRUD操做。sql

在微軟推薦的前20個EF核心擴展中被選中。數據庫

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

它的目標是netstandard2.0,所以能夠用於NetCore(2.0+)或NetFramework(4.6.1+)的項目。ide

3.1.0和3.0.0之間的版本使用EF Core 3.0,目標是NetStandard 2.1,所以只能在NetCore(3.0+)上使用。sqlserver

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)ui

對於bulkcopy/Insert,在bulkcopy和sqlupdate下結合使用。server

對於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

相關文章
相關標籤/搜索