2017-07-12 108 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是遞延執行和我需要首先將它轉換爲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

將你的方法標記爲async like as'public async任務 GetSomething()' – IvanJazz