Entity Framework Extensions Reduce your save times by up to 95% - Easy to Use, Easy to Customize
Improve EF Core and EF6 Performance
Have you ever used a software tool and wondered why it takes so long to perform a simple task?
Make sure your clients never face that same frustration — deliver them the fastest data-saving performance possible.
Compared to SaveChanges, your performance could improve significantly:
- Insert: Up to 18x faster, reducing time by 95% (Online Benchmark)
- Update: Up to 4x faster, reducing time by 75% (Online Benchmark)
- Delete: Up to 3x faster, reducing time by 65% (Online Benchmark)
Don’t just take our word for it — click our Online Benchmark link and see the results with your own eyes.
You see? Even convincing you that these performance gains are real was fast!
Our library shines when you need to import or save hundreds, thousands, or even millions of entities efficiently in your database.
SaveChanges vs Bulk Insert
| Operations | 1,000 Entities | 2,000 Entities | 5,000 Entities |
|---|---|---|---|
| SaveChanges | 1,200 ms | 2,400 ms | 6,000 ms |
| BulkInsert | 50 ms | 55 ms | 75 ms |
// @nuget: Z.EntityFramework.Extensions.EFCore using Z.EntityFramework.Extensions; // Easy to use context.BulkInsert(customers); // Easy to customize context.BulkInsert(invoices, options => options.IncludeGraph = true);
Supported Providers
Supported Entity Framework Versions
The Space is the Limit
Companies from every sector trust us
Main Features
Bulk Extensions
Save your entities 95% faster, use only a fraction of the memory, and gain access to 100+ options to customize your saves. Experience the difference.
Try Online Example// 100+ options to customize your saves // Insert only customers that don't exist with a custom key context.BulkInsert(customers, options => { options.InsertIfNotExists = true; options.ColumnPrimaryKeyExpression = customer => customer.Code; }); // Merge (Upsert) with related child entities (Order, OrderItem) context.BulkMerge(orders, options => { options.IncludeGraph = true; });
Bulk SaveChanges
Dramatically improve your client performance and look like an expert by simply adding four letters: Bulk. No reason to hesitate to try it; it couldn't be simpler!
Try Online Example// Just add "Bulk" prefix to "SaveChanges()" // Easy to use context.BulkSaveChanges(); // Easy to customize context.BulkSaveChanges(options => options.BatchSize = 1000);
Bulk Contains
Go beyond Contains method limitations. Use our methods with an unlimited number of entities, with any kind of data source, and join with one or multiple properties.
Try Online Example// Supports: // - Unlimited number of items // - Multiple DataSources: Basic Type, Entity Type, Anonymous Type, Expando // - Surrogate keys (joins on multiple properties) // Return customers from the database matching customers from the list var databaseCustomers = context.Customers.WhereBulkContains(listCustomers); // Return customers from the list matching customers from the database // Additionally, use a surrogate key var sourceCustomers = context.Customers .WhereBulkContainsFilterList(listCustomers, x => new { x.Email, x.Name });
Batch Operations
Use the power of LINQ to INSERT, UPDATE, and DELETE directly in your database. Maximize your performance without loading entities.
Try Online Examplevar dateToDeactivate = DateTime.Now.AddYears(-2); // UPDATE active customers who haven’t logged in recently context.Customers .Where(x => x.IsActive && x.LastLogin < dateToDeactivate) .UpdateFromQuery(x => new Customer { IsActive = false }); // INSERT inactive customers into a backup table context.Customers .Where(x => !x.IsActive && !x.Invoices.Any()) .InsertFromQuery("bck_Customers", x => new { x.CustomerID, x.Code, x.Name, x.Email, x.LastLogin }); // DELETE inactive customers context.Customers .Where(x => !x.IsActive && !x.Invoices.Any()) .DeleteFromQuery();
