2016-03-28 3 views
1

に配置されたオブジェクトのDataContext asp.netにアクセスすることはできません。 DIを使用して、Datacontext(db)をクラスに挿入しています。与えられた時間メソッドが計画通りに実行が、私は例外を取得した後は、私は非同期を使用して遅延して、私のDBから項目を削除するasp.net 5 /コアで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(); 
    } 
} 

は、私は次のメソッドを作成したサービスはのために配置されているので、おそらく「で破棄されたオブジェクトにアクセスすることはできません」遅延。 メソッド内のdatacontextの新しいインスタンスを解決する必要がありますか、これをどのように修正する必要がありますか? アイデア 事前にお手伝いいただきありがとうございます。

UPDATE:

メソッドを呼び出す:

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

更新方法:

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

例外db.Items.Remove(アイテム)に発生します。

+0

Datacontextはどのように登録されていますか?トランジェントとして? –

+5

'async void'の代わりに' async Task'を使ってみましたか? startup.csで – Domysee

+0

:services.AddEntityFramework().AddSqlServer()AddDbContext (オプション=> options.UseSqlServer(構成[ "データ:DefaultConnectionを:のConnectionString"]))。 –

答えて

5

DeleteItemAfterTimeAsyncメソッドがasync voidであるため、待機することはできず、dbコンテキストを使用するときには既に破棄されています。

DeleteItemAfterTimeAsyncメソッドをasync Taskawaitに変更します。

+0

ありがとうパウロ、私はすでにそれを試みた。削除(アイテム)を呼び出そうとすると、「例外がスローされました:」System.ObjectDisposedExceptionが「EntityFramework.Core.dll」にあります。 IDを照会することは問題ありません... –

+0

更新コードと呼び出しコードを表示できますか? –

+0

質問を更新しました... –

1

私は同じ問題を抱えていました。その理由は、コールスタックで非同期メソッドが深く、 'await'で呼び出されなかったためです。 (あなたの例では、 'await DeleteItemAfterTimeAsync'を使用するメソッドは、それ自身を待って呼び出されません)

使用されているDbContextは、待たずに呼び出すオブジェクトに依存関係が挿入されています。私は非同期メソッドを待たずにDbContextが破棄されたと思います。

今では、あなたはきっとあなたの問題を解決してきたが、コールスタックを確認することは良い考えかもしれません!

関連する問題