2016-03-28 11 views
1

In asp.net 5/core Ich möchte ein Element aus meinem db mit einer Verzögerung mit async löschen. Ich verwende DI, um meinen Datacontext (db) in die Klasse zu injizieren.kann nicht auf ein Objekt zugreifen. Datenkontext asp.net 5

Ich habe die folgende Methode:

public async void DeleteItemAfterTimeAsync(int itemId, TimeSpan timeSpan) 
{ 
    // give user time to fill out data 
    await Task.Delay(timeSpan); 
    var item = db.Items.FirstOrDefault(p => p.Id == itemId); 
    if (item!= null && item.Status == someStatus) 
    { 
     db.Items.Remove(item); 
     db.SaveChanges(); 
    } 
} 

Nach der vorgegebenen Zeit wird das Verfahren wie geplant ausgeführt, aber ich erhalte eine Ausnahme: ‚ein angeordnete Objekt nicht zugreifen kann‘, die wahrscheinlich ist, weil der Dienst wegen angeordnet ist, von die Verzögerung. Sollte ich eine neue Instanz meines Datenkontexts in der Methode auflösen oder wie soll ich das beheben? Irgendwelche Ideen? Vielen Dank für Ihre Hilfe im Voraus.

UPDATE:

Aufruf der Methode:

await DeleteItemAfterTimeAsync(item.Id, new TimeSpan(0, 1, 0)); 

Aktualisiert Methode:

public async Task DeleteItemAfterTimeAsync(int itemId, TimeSpan timeSpan) 
{ 
    // give user time to fill out data 
    await Task.Delay(timeSpan); 
    var item = db.Items.FirstOrDefault(p => p.Id == itemId); 
    if (item != null && item.Status == someStatus) 
    { 
     db.Items.Remove(item); 
     db.SaveChanges(); 
    }  
} 

Ausnahme tritt auf db.Items.Remove (Punkt);

+0

Wie ist der Datacontext registriert? Als vorübergehend? –

+5

Haben Sie versucht, 'async Task' anstelle von' async void' zu verwenden? – Domysee

+0

In startup.cs: services.AddEntityFramework() .AddSqlServer(). AddDbContext (Optionen => Optionen.UseSqlServer (Konfiguration ["Data: DefaultConnection: ConnectionString"]))); –

Antwort

5

Da Ihre DeleteItemAfterTimeAsync-Methode eine async void ist, kann sie nicht erwartet werden, und bis Sie den db-Kontext verwenden, wurde sie bereits entsorgt.

Ändern Sie die DeleteItemAfterTimeAsync Methode zu async Task und await es.

+0

Danke Paulo, aber das habe ich schon probiert. Immer noch eine 'Ausnahme ausgelöst:' System.ObjectDisposedException 'in EntityFramework.Core.dll', wenn ich versuche, Remove (Element) aufzurufen. Das Abfragen der ID ist kein Problem ... –

+0

Können Sie den Aktualisierungscode und den aufrufenden Code anzeigen? –

+0

Die Frage wurde aktualisiert ... –

1

Ich hatte das gleiche Problem. Der Grund war, dass ich eine Async-Methode tiefer im Call-Stack hatte, die nicht mit "Warten" aufgerufen wurde. (In Ihrem Beispiel würde die Methode, die 'awarte DeleteItemAfterTimeAsync' verwendet, nicht mit await selbst aufgerufen werden)

Der verwendete DbContext war die Abhängigkeitsinjektion in das Objekt, das aufruft, ohne zu warten. Ich denke, der DbContext wurde entsorgt, als ich nicht auf die Async-Methode wartete.

Inzwischen haben Sie sicherlich Ihr Problem gelöst, aber es könnte eine gute Idee sein, den Call-Stack zu überprüfen!

Verwandte Themen