批量操作(插入、更新、刪除、讀取、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技術控 獲取更多資訊
