Aggiornamento di Entity Framework Z Plus

entity-framework entity-framework-6 entity-framework-plus

Domanda

Sto usando il metodo di aggiornamento batch di Entity Framework Z Plus. Non riesco a procedere a causa del problema in basso. In realtà il metodo di aggiornamento funziona bene quando fornisco valori statici come tagName="amir1" . Ma ho bisogno di ottenere la Tagdescription da un servizio Web o da un'altra raccolta basata sul tagId , il metodo di aggiornamento non accetta un metodo di estensione o altri metodi per soddisfare il mio requisito.

"LINQ to Entities non riconosce il metodo metodo 'System.String GetTagDescription (Int32)' e questo metodo non può essere tradotto in un'espressione di archivio.".

Spero che il mio requisito sia chiaro ora. Per favore guidami se c'è qualche altro approccio per il mio requisito.

Ecco il mio codice:

using (var context = new TrialsDBEntities())
{
     context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).
                Update(m => new tblTag { tagDescription = m.tagId.GetTagDescription(), tagName = "amir1" });
}

public static string GetTagDescription(this int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     getting some text by giving i as input
}

Risposta accettata

Scrivi il tuo codice come segue:

using (var context = new TrialsDBEntities())
{
   var tagsToBeUpdated =  context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).AsNoTracking().ToList();

   //Only use this code block if your tagsToBeUpdated list is too large
   Parallel.ForEach(tagsToBeUpdated, tagToBeUpdated =>
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   });

   //Only use this code block if your tagsToBeUpdated list is not too large
   foreach(var tagToBeUpdated in tagsToBeUpdated)
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   }

   context.SaveChanges();         
}

public static string GetTagDescription(int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     //getting some text by giving i as input
}

Risposta esperta

Disclaimer : sono il proprietario del progetto Entity Framework Plus

Sfortunatamente, non è possibile utilizzare BatchUpdate con un valore che cambia da una riga all'altra.

Disclaimer : sono il proprietario del progetto Entity Framework Extensions

In questa situazione, in genere consigliamo di utilizzare la nostra libreria a pagamento creata per questo tipo di situazione e che offre operazioni di salvataggio ad alte prestazioni.

Esempio

// Easiest way
context.BulkSaveChanges();

// Fastest way
context.BulkUpdate(tags);



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché