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();
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
@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
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