2016-03-28 16 views
1

Asp.net 5/core'de bir öğeyi db'den async kullanarak bir gecikme ile silmek istiyorum. Sınıfta benim Datacontext (db) enjekte etmek için DI kullanıyorum. verilen süre yöntemi planlandığı gibi çalıştırılır ancak istisna almak sonraatılan bir nesneye erişemiyor Datacontext asp.net 5

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

:

Ben aşağıdaki yöntemi oluşturulan hizmet nedeniyle konumlandırılmış olması nedeniyle muhtemelen 'bir nesneye erişilemiyor olamaz' gecikme. Metodda yeni bir veri örneğini çözmeli miyim yoksa bunu nasıl düzeltmeliyim? Herhangi bir fikrin var mı? Şimdiden yardımcı olduğunuz için teşekkürler.

GÜNCELLEME:

yöntemin çağrılması:

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

Güncelleme yöntemi:

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

İstisna db.Items.Remove (item) oluşur;

+0

Datacontext nasıl kaydedilir? Geçici olarak mı? –

+5

"async void" yerine "async Task" kullanmayı denediniz mi? – Domysee

+0

startup.cs: services.AddEntityFramework() .AddSqlServer(). AddDbContext (options => options.UseSqlServer (Yapılandırma ["Veri: DefaultConnection: ConnectionString"])); –

cevap

5

Sizin DeleteItemAfterTimeAsync yönteminiz bir async void olduğundan, beklemez ve db içeriğini kullandığınızda, zaten elden çıkarılmıştır.

DeleteItemAfterTimeAsync yöntemini async Task ve await olarak değiştirin.

+0

Teşekkürler Paulo, ama çoktan denedim. Hala Kaldır (madde) aramaya çalıştığınızda 'Exception atılmış:' EntityFramework.Core.dll 'System.ObjectDisposedException' olsun. Kimliği sorgulamak hiç sorun değil ... –

+0

Güncelleme kodunu ve çağrı kodunu gösterebilir misiniz? –

+0

Soruyu güncelleştirin ... –

1

Aynı problem vardı. Bunun nedeni, çağrı beklemede 'bekle' ile çağrılmayan bir async yönteminin olmasıydı. (örneğinizde, 'deleteItemAfterTimeAsync' yöntemini kullanarak yöntemi beklemezdi.)

Kullanılan DbContext, beklemeden nesne çağrısında bağımlılık enjekte edildi. Async yöntemini beklemediğimde, DbContext yerleştirildi sanırım.

Şimdilik sorununuzu çözdünüz, ancak çağrı yığınını kontrol etmek iyi bir fikir olabilir!