2017-04-20 2 views
1

Je retire un tas d'entrées de feuille de temps de la base de données et les utilise pour créer une facture. Une fois que j'ai enregistré la facture et que j'ai un identifiant, je veux mettre à jour les entrées de la feuille de temps avec l'ID de la facture. Existe-t-il un moyen de mettre à jour en vrac les entités sans les charger une à la fois?Mise à jour en masse dans Entity Framework Core

void SaveInvoice(Invoice invoice, int[] timeEntryIds) { 
    context.Invoices.Add(invoice); 
    context.SaveChanges(); 

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

Répondre

1

Si TimeEntry a une association à Invoice (vérifier les propriétés de navigation), vous pouvez probablement faire quelque chose comme ceci:

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(); 
+0

Au lieu de cela, j'ai ajouté le TimeEntries à la facture avant de l'avoir enregistrée. invoice.TimeEntries = context.TimeEntries.Where (te => timeEntryIds.Contains (te.Id)). ToArray() –

1

Êtes-vous après l'exécution de la syntaxe simplifiée?

Je suggère d'utiliser requête SQL directe,

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

Pour séparées par des virgules ids vous pouvez faire string.Join(',', timeEntryIds)

Cela dépend de ce que vous avez réellement besoin. Si vous voulez aller avec Linq, vous devez parcourir chaque objet.

2

Responsabilité: Je suis le propriétaire du projet Entity Framework Plus

Notre bibliothèque dispose d'une fonctionnalité lot de mise à jour que je crois est ce que vous cherchez

Cette prise en charge des fonctionnalités EF de base

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

Wiki: EF Batch Update