Entity Framework Z Plus Stapelaktualisierung


Frage

Ich verwende Entity Framework Z Plus Batch-Update-Methode. Ich kann aufgrund des unten angegebenen Problems nicht fortfahren. Eigentlich funktioniert die Update-Methode gut, wenn ich statische Werte wie tagName="amir1" . Aber ich muss die Tagdescription von einem Web-Service oder von einer anderen Sammlung basierend auf dem tagId , Update-Methode akzeptiert keine Erweiterungsmethode oder eine andere Methode, um meine Anforderung zu erfüllen.Sie sagen

"LINQ to Entities erkennt die Methode 'System.String GetTagDescription (Int32)' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden."

Hoffe, meine Anforderung ist jetzt klar. Bitte führen Sie mich, wenn es einen anderen Ansatz für meine Anforderung gibt.

Hier ist mein Code:

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
}

Akzeptierte Antwort

Schreibe deinen Code wie folgt:

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
}

Expertenantwort

Haftungsausschluss : Ich bin der Eigentümer des Projekts Entity Framework Plus

Leider ist es nicht möglich, BatchUpdate mit einem Wert zu verwenden, der sich von einer Zeile in eine andere ändert.

Haftungsausschluss : Ich bin der Eigentümer des Projekts Entity Framework Extensions

In dieser Situation empfehlen wir normalerweise, unsere kostenpflichtige Bibliothek zu verwenden, die für diese Art von Situation entwickelt wurde und einen leistungsstarken Speichervorgang bietet.

Beispiel

// Easiest way
context.BulkSaveChanges();

// Fastest way
context.BulkUpdate(tags);




Lizenziert unter: CC-BY-SA
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum