为什么当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
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow