Bulk Update in Entity Framework Core

Are you after the performance of simplified syntax?

I would suggest to use direct SQL query,

 string query = "Update TimeEntries Set InvoiceId = <invoiceId> Where Id in (comma separated ids)";    
 context.Database.ExecuteSqlCommandAsync(query);

For comma separated ids you can do string.Join(',', timeEntryIds)

It depends on what you actually need. If you want to go with Linq, then you need to iterate through each object.


Disclaimer: I'm the owner of the project Entity Framework Plus

Our library has a Batch Update feature which I believe is what you are looking for

This feature supports EF Core

// Is there anything like? YES!!!
context.TimeEntries
    .Where(te => timeEntryIds.Contains(te.Id))
    .Update(te => new TimeEntry() { InvoiceId = invoice.Id });

Wiki: EF Batch Update

EDIT: Answer comment

does it supports contains as in your example? I think this is coming from EF Core which is not supported feature in 3.1 version even

EF Core 3.x support contains: https://dotnetfiddle.net/DAdIO2

EDIT: Answer comment

this is great but this requires to have zero parameter public constructors for classes. which is not a great. Any way to get around this issue?

Anonymous type is supported starting from EF Core 3.x

context.TimeEntries
    .Where(te => timeEntryIds.Contains(te.Id))
    .Update(te => new { InvoiceId = invoice.Id });

Online example: https://dotnetfiddle.net/MAnPvw


If TimeEntry has an association to Invoice (check the navigation properties), you can probably do something like this:

var timeEntries = context.TimeEntries.Where(t => timeEntryIds.Contains(te.Id)).ToArray();

foreach(var timeEntry in timeEntries)
    invoice.TimeEntries.Add(timeEntry);

context.Invoices.Add(invoice);

//save the entire context and takes care of the ids
context.SaveChanges();

As of EFCore 7.0 you will see the built-in BulkUpdate() and BulkDelete methods:

context.Customers.Where(...).BulkDelete();
context.Customers.Where(...).BulkUpdate(c => new Customer { Age = c.Age + 1 });
context.Customers.Where(...).BulkUpdate(c => new { Age = c.Age + 1 });