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技術控   獲取更多資訊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM