2017-07-12 13 views
1

を配置:非同期メソッドは、私は下に次のコード持って

public Task<Service> GetSomething() 
{ 
    using (var myContext = new DbContext()) 
    { 
     var returnObj = (from rp in myContext.Services1 
         join op in myContext.Services2 on rp .Id equals op.ServiceId into g 
         join ep in myContext.Services3 on rp .Id equals ep.ServiceId 
         from n in g.DefaultIfEmpty() 
         where rp.Name == code 
         select rp).FirstOrDefaultAsync(); 

     return returnObj; 
    } 
} 

を今、これが働いていると私はエラーに遭遇しています:読んだ後

The operation cannot be completed because the DbContext has been disposed. 

を、FirstOrDefaultAsyncがdeffered実行であるように見え、具体的には最初にlistに変換する必要があります。

.ToListAsync()を試したが、それ以降はFirstOrDefaultがないため、このクエリの結果を変換する方法を教えてください。あなたのケースでは

+0

、どの行が例外をスローしていますか?遅延ロードが有効になっていますか?あなたが@Yeldar Kurmangaliyevによって提案された変更を行い、まだ例外を処理してしまった場合、私は原因として遅延ロードを考えることができます。 –

答えて

0

は、EF6 Async操作が呼び出され、そのタスクは、元の呼び出し元に返されます。そして、完了を待つことなく、DbContextがすぐに配置されます。
それはasync/await機能の間違った使い方です。あなたのコンテキストを配置する前に、結果を待つ必要がある

public async Task<YourEntity> GetYourEntity() 
{ 
    using (var myContext = new DbContext()) 
    { 
    var returnObj = (from rp in myContext.Services1 
        join op in myContext.Services2 on rp .Id equals op.ServiceId into g 
        join ep in myContext.Services3 on rp .Id equals ep.ServiceId 
        from n in g.DefaultIfEmpty() 
        where rp.Name == code 
        select rp).FirstOrDefaultAsync(); 

    //return returnObj; // returns Task, wrong! 
    return await returnObj; // returns result, right! 
    } 
} 

この方法で、それが完了してからmyContextを配置する操作を待ちます。

+0

マークあなたの方法)(タスク GetSomething非同期ので '公共のような非同期として' – IvanJazz

関連する問題