为什么 EF7 说我没有配置任何提供程序,而 ASP.net 标识在同一 DbContext 上工作正常

本文关键字:标识 net DbContext 工作 ASP EF7 配置 程序 任何提 为什么 | 更新日期: 2023-09-27 18:36:40

我刚刚开始使用 ASP.net 5,MVC6和实体框架7进行实验性项目。我 ASP.Net 标识工作正常,但随后尝试将我自己的一些数据添加到 DbContext 并遇到此问题。EF7 报告:

处理

请求时发生未处理的异常。

无效操作异常:未配置任何数据库提供程序。 通过覆盖在 DbContext 类或在设置 AddDbContext 方法中 服务业。

Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource 提供者来源)堆栈查询 Cookie 标头

无效操作异常:未配置任何数据库提供程序。 通过覆盖在 DbContext 类或在设置 AddDbContext 方法中 服务业。

这是我的配置方法:

    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 将创建数据库、创建标识表并使用用户数据填充它们。还会创建产品表,因此很明显,在某种程度上,EF 能够使用该ApplicationDbContext并找到用于创建数据库和架构的提供程序。

但是,当我尝试访问使用ProductsRepository的产品控制器时,EF 抱怨 - 即使ApplicationDbContext在这两种情况下都用于创建数据库!

那怎么来呢?ASP.net Identity 有什么特别之处,它可以以某种方式获得提供程序,但我自己的代码不能?我错过了什么"魔法咒语"?

为什么 EF7 说我没有配置任何提供程序,而 ASP.net 标识在同一 DbContext 上工作正常

这是因为您正在更新它,而不是为您注入它。您正在新建的那个尚未配置。您应该更改类以将其传递到构造函数中。

DbContext 有多个构造函数,您正在使用未配置它的空构造函数。

最好通过使您的构造函数像这样来注入它:

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

您的代码显示 ApplicationDbContext 已向 DI 注册,Identity 正在使用注入的 IDENTITY,但您不是,因为您自己使用无参数构造函数对其进行了更新

您还应该注册您的应用程序单位工作,以便可以注入:

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();