為什麼當ASP.net Identity使用相同的DbContext工作正常時,EF7說我沒有配置任何提供程序?

asp.net-core c# ef-code-first entity-framework-core

我剛剛開始使用ASP.net 5,MVC6和Entity Framework 7開展實驗項目。我的ASP.Net Identity工作正常,但後來嘗試將我自己的一些數據添加到DbContext並解決了這個問題。 EF7報告:

處理請求時發生未處理的異常。

InvalidOperationException:未配置任何數據庫提供程序。在設置服務時,通過在DbContext類或AddDbContext方法中覆蓋OnConfiguring來配置數據庫提供程序。

Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)堆棧查詢Cookie標頭

InvalidOperationException:未配置任何數據庫提供程序。在設置服務時,通過在DbContext類或AddDbContext方法中覆蓋OnConfiguring來配置數據庫提供程序。

這是我的配置方法:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();

        services.AddTransient<ApplicationUnitOfWork>(instance => new ApplicationUnitOfWork());
    }

ApplicationUnitOfWork是EF7上的一種減少緊密耦合的方法。到目前為止,這是整個事情:

public class ApplicationUnitOfWork : IUnitOfWork
    {
    readonly ApplicationDbContext dbContext;

    public ApplicationUnitOfWork()
        {
        dbContext = new ApplicationDbContext();
        Products = new ProductRepository(dbContext);
        }

    public void Dispose() { dbContext.Dispose(); }

    public IUserRepository Users { get; }

    public IRepository<SoftwareProduct> Products { get; }

    public async Task CommitAsync() { await dbContext.SaveChangesAsync(); }

    public void Cancel() { throw new NotImplementedException(); }
    }

現在,當我運行Web應用程序時,我能夠註冊用戶帳戶並登錄,EF創建數據庫,創建Identity表並使用用戶數據填充它們。還創建了products表 - 因此在某種程度上,EF能夠使用ApplicationDbContext並找到它用於創建數據庫和模式的提供程序。

然而,當我嘗試訪問我的產品控制器,它使用ProductsRepository ,EF抱怨-即使ApplicationDbContext在這兩種情況下使用,用於創建數據庫!

那怎麼來的? ASP.net Identity有什麼特別的,它可以某種方式獲得提供者,但我自己的代碼不能?我錯過了什麼“神奇的咒語”?

一般承認的答案

它是因為你正在新建它,而不是為它注入它。您正在新建的那個尚未配置。您應該更改您的類以將其傳遞給構造函數。

DbContext有多個構造函數,你使用的是沒有配置它的空元素。

最好通過製作這樣的構造函數來注入它:

 public ApplicationUnitOfWork(ApplicationDbContext context)
 {
    dbContext = context;
    Products = new ProductRepository(dbContext);
 }

你的代碼顯示ApplicationDbContext已經註冊了DI,Identity正在使用注入的那個,但是你不是因為你用無參數構造函數自己創建了它

您還應註冊您的ApplicationUnitOfWork,以便注入:

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因