EF Core Bulk Delete Optimize Entity Framework Delete Performance
Description
The EF BulkDelete
extension method let you delete a large number of entities in your database.
// Easy to use context.BulkDelete(customers); // Easy to customize context.BulkDelete(customers, options => options.BatchSize = 100);
Try it in EF Core | Try it in EF6
Performance Comparison
Operations | 1,000 Entities | 2,000 Entities | 5,000 Entities |
---|---|---|---|
SaveChanges | 1,200 ms | 2,400 ms | 6,000 ms |
BulkDelete | 50 ms | 55 ms | 75 ms |
Try it in EF Core | Try it in EF6
HINT:A lot of factors might affect the benchmark time such as index, column type, latency, throttling, etc.
Scenarios
The BulkDelete
method is fast but also flexible to let you handle various scenarios in Entity Framework such as:
What is supported?
- All Entity Framework Core Version: EF Core 7, EF Core 6, EF Core 5, EF Core 3
- All Entity Framework Version: EF6, EF5, EF4
- All Inheritances (TPC, TPH, TPT)
- Complex Type/Owned Entity Type
- Enum
- Value Converter (EF Core)
- And more!
Advantages
- Easy to use
- Flexible
- Increase performance
- Increase application responsiveness
- Reduce database load
- Reduce database round-trips
Getting Started
Bulk Delete
The BulkDelete
and BulkDeleteAync
methods extend your DbContext
to let you delete a large number of entities in your database.
context.BulkDelete(customers); context.BulkDeleteAsync(customers, cancellationToken);
Try it in EF Core | Try it in EF6
Bulk Delete with options
The options
parameter let you use a lambda expression to customize the way entities are deleted.
context.BulkDelete(customers, options => options.BatchSize = 100);
Try it in EF Core | Try it in EF6
Why BulkDelete is faster than SaveChanges?
Deleting thousands of entities for a file importation is a typical scenario.
The SaveChanges
method makes it quite impossible to handle this kind of situation due to the number of database round-trips required. The SaveChanges
performs one database round-trip for every entity to delete. So, if you need to delete 10,000 entities, 10,000 database round-trips will be performed which is INSANELY slow.
The BulkDelete
in counterpart requires the minimum number of database round-trips possible. For example, under the hood for SQL Server, a SqlBulkCopy
is performed first in a temporary table, then a DELETE
from the temporary table to the destination table is performed which is the fastest way available.
Real Life Scenarios
Delete with custom key
You want to delete entities, but you don't have the primary key. The ColumnPrimaryKeyExpression
let you use as a key any property or combination of properties.
context.BulkDelete(customers, options => options.ColumnPrimaryKeyExpression = c => c.Code);
Try it in EF Core | Try it in EF6
Delete with related child entities (Include Graph)
You want to delete entities but also automatically delete related child entities.
IncludeGraph
: This option lets you to automatically delete all entities part of the graph.IncludeGraphBuilder
: This option lets you customize how to delete entities for a specific type.
context.BulkDelete(invoices, options => options.IncludeGraph = true);
NOTE: Only support EF Core 3+
Delete with future action
You want to delete entities, but you want to defer the execution.
By default, BulkDelete
is an immediate operation. That means, it's executed as soon as you call the method.
FutureAction
: This option let you defer the execution of a Bulk Delete.
ExecuteFutureAction
: This option trigger and execute all pending FutureAction
.
context.FutureAction(x => x.BulkDelete(customers1));
context.FutureAction(x => x.BulkDelete(customers2));
// ...code...
context.ExecuteFutureAction();
Try it in EF Core | Try it in EF6
More scenarios
Hundreds of scenarios have been solved and are now supported.
The best way to ask for a special request or to find out if a solution for your scenario already exists is by contacting us: info@zzzprojects.com
Documentation
BulkDelete
Methods
Name | Description | Example |
---|---|---|
BulkDelete<T>(items) |
Bulk delete entities in your database. | EFCore / EF6 |
BulkDelete<T>(items, options) |
Bulk delete entities in your database. | EFCore / EF6 |
BulkDeleteAsync<T>(items) |
Bulk delete entities asynchronously in your database. | EFCore / EF6 |
BulkDeleteAsync<T>(items, cancellationToken) |
Bulk delete entities asynchronously in your database. | EFCore / EF6 |
BulkDeleteAsync<T>(items, options, cancellationToken) |
Bulk delete entities asynchronously in your database. | EFCore / EF6 |
Options
More options can be found here:
- Audit
- Batch
- Column
- Context Factory
- Execute Event
- Identity
- Include Graph
- Key
- Logging
- Temporary Table
- Transaction
- Transient Error
- SQL Server
ZZZ Projects