2017-05-18 154 views
2

我正在使用VS代碼並遵循ASP.NET Core/EF Core教程,並承認我不太清楚關於異步,等待和任務如何執行(當然,我知道前兩個,但不是第三個)。我正在首次實現一個存儲庫,並且要使用UnitofWork類和接口。這裏是的UnitOfWork類:如何解決:異步方法的返回類型必須爲空,任務或任務<T> [AppName]

using System.Threading.Tasks; 

namespace vega.Persistence 
{ 
    public class UnitOfWork : IUnitOfWork 
    { 
    private readonly VegaDbContext context; 

    public UnitOfWork(VegaDbContext context) 
    { 
     this.context = context; 
    } 

    public async Task CompleteAsync() 
    { 
     await context.SaveChangesAsync(); 
    } 
    } 
} 

除了通過VS-代碼智能感知所示,當我將鼠標懸停在CompleteAsync動作名稱的主題行錯誤,我得到這個:

'UnitOfWork.CompleteAsync()': not all code paths return a value [AppName] 

或者其他相關摘要:

using System; 
using System.Threading.Tasks; 

namespace vega.Persistence 
{ 
    public interface IUnitOfWork 
    { 
     Task CompleteAsync(); 
    } 
} 

在我Startup.cs:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add Repository and UnitOfWork --scoped (instance persits for life of request), 
    // not Transient or Singleton 
    services.AddScoped<IVehicleRepository, VehicleRepository>(); 
    services.AddScoped<IUnitOfWork, UnitOfWork>(); 
} 
+0

這真的很奇怪,我沒有看到你的代碼有什麼問題。也許這是VS Code的一個錯誤。您是否嘗試在您的項目所在的文件夾中運行'dotnet build'來查看是否收到任何錯誤消息?順便說一下,在使用EF時編寫工作單元並不是很有用,DataContext已經是一個UnitOfWork實現。如果你想讓DataContext遠離你的控制器,你應該編寫一個服務。 – Gimly

+0

是的。 => '構建失敗。 持久\ UnitOfWork.cs(14,23):錯誤CS1983:方法 必須是void一個異步的返回類型,任務或任務 [C:\用戶\ .. \ Vega.csproj] 0警告(S ) 1錯誤' – PakiPat

+0

還恢復了項目,並重新啓動VS代碼。 – PakiPat

回答

3

您還有另一個vega.Persistence.Task類型在您的項目中定義。只需添加的命名空間來糾正System.Threading.Tasks.Task作爲方法的返回類型:

public async System.Threading.Tasks.Task CompleteAsync() 
{ 
    await context.SaveChangesAsync(); 
} 

而且在相同的接口。

+0

試過這個,但得到: '不能隱式轉換類型'System.Threading.Tasks.Task '到'vega.Persistence.Task'[Vega]' – PakiPat

+0

這是否意味着上下文是'持久性',而不是我真實的DbContext對象? – PakiPat

+3

然後你只是回答你自己的問題。你有2個名爲Task的類,你的代碼可能是引用vega.Persistence.Task而不是System.Threading.Tasks.Task ... – Marko

相關問題