In EF6, I want to update/delete bulk data in one query. My code is
using (var context = _dataContextFactory.GetContext())
{
var
Unfortunately, this is not supported in Entity Framework out of the box. However, you can use the batch update functionality in the EntityFramework.Extended
library:
https://github.com/loresoft/EntityFramework.Extended
There's a nuget package available, too.
An example would be:
using EntityFramework.Extensions;
...
int[] myIds = { 592, 593, 594 };
using (var context = _dataContextFactory.GetContext())
{
// Define a filter expression to retrieve matching items
var filter = context.MyTables.Where(item => myIds.Contains(item.Id));
// Update the StatusId of matched items
context.MyTables.Update(filter, i => new Item { StatusId = 3 });
// NB: no context.SaveChanges() required
}
NB: there may be a more efficient way of writing this, but I'm still playing with the library. It does compile down to a single SQL statement, however, and the library also includes batched DELETEs.
Finally, don't worry about the new
expression. Any properties which are not referenced here will retain their original values.
You can't update multiple rows in one single SQL call with EF.
What you could do instead is to write a stored procedure that'll do the job efficiently for you. Or use a third party lib that provides extensions to EF to do it.
Of course, it won't makes sense if the number of rows to update is really small.