2014-12-05 11 views
5

Sono curioso di sapere quale sia il modo corretto di aggiornare un elenco di entità contemporaneamente.Qual è il modo corretto di aggiornare molti a molti con EF?

public ActionWas Update(IEnumerable<surcharge_template> templates) 
    { 
     try 
     { 
      var templatesToBeUpdated = _context.surcharge_template.Where(x => templates.Select(template => template.st_key).Contains(x.st_key)); 
      //Right here I need to map all of the differences from the original templates 
      //to the new templates 
      _context.Entry(templatesToBeUpdated).State = EntityState.Modified; 
     } 
     catch (Exception ex) 
     { 
      return _exceptionConverter.Convert(ex); 
     } 
     _context.SaveChanges(); 
     return ActionWas.Successsful; 
    } 

Ho inserito un commento nel punto in cui non sono sicuro del modo in cui gestirlo. Ottengo i modelli originali dal database e quindi ho bisogno di mapparli, quindi eseguire il commit e salvare.

Quindi qual è il modo corretto per mapparli?

UPDATE:

vorrei farlo con EF solo fare una chiamata al database. L'enumerazione dell'elenco causerebbe istruzioni di aggiornamento multipezzo.

+0

Domanda ripetuta. [Link qui] (http://stackoverflow.com/questions/10314552/how-to-update-the-multiple-rows-at-a-time-using-linq-to-sql) – Sarbanjeet

+1

@Sarbanjeet Non ho visto qualsiasi cosa in quel post che parla di come impedire a EF di effettuare più chiamate di aggiornamento al DB quando si chiama saveChanges. – Robert

+0

EntityFramework.Extended aiuterà – Miguel

risposta

1

Non è necessario mappare l'entità corrente. È possibile utilizzare invece una sintassi come SQL Update.

Usa EntityFramework.Extended

//update all tasks with status of 1 to status of 2 
context.Templates.Update(
    t => t.StatusId == 1, 
    t2 => new Template {StatusId = 2}); 

Questa è solo una soluzione, alla fine, se avete bisogno di fare modifiche diverse per ogni modello è necessario modificare lo stato dell'entità.

0

Il metodo Attach non associa sub-entità. Per fare ciò, è necessario collegare tutti i target dipendenti che si desidera aggiornare. È possibile utilizzare GraphDiff per aggiornare un grafico completo senza associare le entità. L'utilizzo è qualcosa di simile:

using (var context = new TestDbContext()) 
{ 
    // Update the company and state that the company 'owns' the collection Contacts. 
    context.UpdateGraph(company, map => map 
     .OwnedCollection(p => p.Contacts, with => with 
      .AssociatedCollection(p => p.AdvertisementOptions)) 
     .OwnedCollection(p => p.Addresses) 
    ); 

    context.SaveChanges(); 
} 

Questa è una brief introduction al quadro.

Spero che questo aiuto!

Problemi correlati