批量操做(插入、更新、刪除、讀取、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