2017-05-18 4 views
0

Ich arbeite mit Entity-Framework und wenn ich Context.entities-Methode aufrufen, auch wenn Datenbank einen neuen Wert haben, gibt es mir alten Wert.DbUpdateConcurrencyException beim Speichern von Daten

Zum Beispiel habe ich Spaltenstatus und es wird von einer Konsolenanwendung auf 9 aktualisiert (andere Anwendung aber verwendet die gleiche Methode zu aktualisieren) und beim Aufrufen von context.entities gibt 0, was der Wert vor Update-Vorgang war.

Eine Sache, die ich hervorheben möchte, ist, dass, wenn die Konsolenanwendung einen Datensatz aktualisiert, DbUpdateConcurrencyException ausgelöst wird. Diese Methode behandelt diese Ausnahme, indem sie dem Code folgt.

public async System.Threading.Tasks.Task<int> SaveChanges() 
{ 
    int count = 0; 
    bool saveFailed; 

    do 
    { 
     saveFailed = false; 
     try 
     { 
      count = await this.context.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      saveFailed = true; 
      // Update original values from the database 
      var entry = ex.Entries.Single(); 
      entry.OriginalValues.SetValues(entry.GetDatabaseValues()); 
     } 
    } 
    while (saveFailed); 

    return count; 
} 

//update code 
Task.Run(async() => 
{ 
    while (true) 
    { 
     var timeNow = DateTime.Now; 
     var entities = repo.All() 
          .Where(p => p.CreatedAt.HasValue && 
             p.Status == Infrastructure.Enum.Status.New || 
             p.Status == Infrastructure.Enum.Status.Pending) 
          .ToList() 
          .Where(p => timeNow.Subtract(p.CreatedAt.Value.DateTime) >= TimeSpan.FromSeconds(15)); 
     foreach (var item in entities) 
     { 
      //update 
      item.Status= Status.Cancelled; 
     } 

     await repo.SaveChanges(); 
     await Task.Delay(1000); 
    } 
}).Wait(); 
+0

Der Code, den Sie gepostet haben, wird einfach alle Änderungen in der Entität wiederherstellen, wenn eine 'DbUpdateConcurrencyException' ausgelöst wird. Sie müssen also die Ursache für die' DbUpdateConcurrencyException' beheben, damit Ihre Änderungen in der Datenbank gespeichert werden können. Schauen Sie sich die Nachricht der 'DbUpdateConcurrencyException' an, die eigentlich die Ursache des Fehlers anzeigen sollte. – bassfader

+0

@bassfader Danke für die Antwort, aber wenn es alle Werte zurückstellt, dann in der Datenbank, warum sehe ich neue Werte. Ich habe die Frage aktualisiert, damit Sie Code zum Aktualisieren sehen können. – Nirmal

+0

Ich habe es mit Hilfe von AsNoTracking() behoben, da beim Abrufen der Liste die Daten zum ersten Mal zwischengespeichert wurden und nach allen nachfolgenden Abfragen dieselben Daten zurückgegeben wurden. – Nirmal

Antwort

0

Ich reparierte sie durch AsNoTracking() verwendet, wie während Liste holen sie die Daten erstmals und nach aller nachfolgenden Anforderung gleiche Daten zurückgegeben wurden zwischengespeichert. -

+0

AsNoTracking() Problem behoben, aber ein neues Problem verursacht, da EF nicht feststellen kann, ob Datensätze aktualisiert werden müssen oder nicht, es fügt jedes Mal neue Datensätze ein, die nicht benötigt werden. – Nirmal

Verwandte Themen