簡體   English   中英

當ASP.net Identity與相同的DbContext正常工作時,為什么EF7表示我沒有配置任何提供程序?

[英]Why does EF7 say I haven't configured any providers, when ASP.net Identity is working fine with the same DbContext?

我剛剛開始使用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表並使用用戶數據填充它們。 產品表也已創建-顯然,在某種程度上,EF能夠使用ApplicationDbContext並找到用於創建數據庫和架構的提供程序。

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

那怎么會 ASP.net Identity有什么特別之處,它可以某種方式獲得提供程序,但是我自己的代碼不能? 我缺少什么“魔咒”?

這是因為您正在更新它,而不是為您注入了它。 您要更新的一個尚未配置。 您應該更改您的類以使其傳遞到構造函數中。

DbContext具有多個構造函數,並且您正在使用未配置的空構造函數。

最好讓您的構造函數像這樣注入它:

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

您的代碼顯示ApplicationDbContext已在DI中注冊,Identity正在使用注入的DI,但自從您使用無參數構造函數對它進行了自定義以來,您就沒有這樣做了。

您還應該注冊您的ApplicationUnitOfWork以便可以注入它:

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM