2017-10-17 164 views
3

如果我嘗試運行這段代碼什麼是.`ToListAsync的目的()`

await _dbContext.Set<T>().ToListAsync(); 

我會得到這個錯誤:

出現InvalidOperationException:源的IQueryable沒有實現IDbAsyncEnumerable 。只有實現IDbAsyncEnumerable的源才能用於實體框架異步操作。欲瞭解更多詳情,請參見http://go.microsoft.com/fwlink/?LinkId=287068

通過下面提供的link我們可以仔細閱讀以下聲明

[...],因爲他們只設計與實體框架一起使用時可能會收到以下錯誤如果您嘗試在不是實體框架查詢的LINQ查詢上使用它們。

那麼爲什麼我不能在DbSet上使用它?對我來說,DbSet顯然是一個實體框架相關的類,因爲它可以在EntityFramework程序集中找到...

按照DbSet MSDN documentation,它實現了IDbAsyncEnumerable.GetAsyncEnumerator()。如果執行IDbAsyncEnumerable,爲什麼不能運行.ToListAsync()

此外,通過使用反編譯ReSharper的挖掘到的代碼我不明白,此時出了問題......在內部使用嘗試我DbSet<T>鑄成IDbAsyncEnumerable<T>AsDbAsyncEnumerable方法應該因爲DbSet器具工作它...

在這一點上我的代碼使用以下行,這正是我期望.ToListAsync()內部做的。

await _dbContext.Set<T>().ToAsyncEnumerable().ToList(); 

爲什麼ToAsyncEnumerable在內部使用?在這種情況下,如果ToListAsync不適用於正常的IQueryableDbSet,則可以使用ToListAsync

+0

發佈*可重現的*例子。 *您的目標是哪個*框架和*哪個數據庫? EF6不是EF Core 2.0。我使用'ToListAsync',但我更喜歡'ToArrayAsync' –

+5

您已經標記了Ef6和EfCore2,請先下定決心。 –

+0

這可能是一個糟糕的混合... ToListAsync()是一種擴展方法。 –

回答

2

Panagiotis Kanavos和Henk Holterman在評論中指出了正確的東西:EF6不是EF Core。出於某種原因,我簡單地認爲這兩者是相同的,「核心」是用作別名的花哨名稱。這可能是因爲這個原因,我最終都在我的項目中。

我嘗試了很多事情來修復錯誤,但最終我通過簡單地刪除了每個可能與我的項目或多或少都與實體框架相關的包,但Microsoft.NETCore.App因爲它在.netcote 2.0中是強制性的應用。從那裏我開始添加軟件包,取決於什麼名稱 - 編譯器在使用MSDN來查找軟件包名稱時所使用的空格和類,並最終再次運行。

現在正確回答我的問題:ToListAsync()完全是它應該做的。它只是不承認EF6 DbContext,因爲它不是EFCore包的一部分。所以混合這兩個不是一個好主意。