Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么EF7说我没有';当ASP.net Identity在同一DbContext中正常工作时,是否未配置任何提供程序?_C#_Ef Code First_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 为什么EF7说我没有';当ASP.net Identity在同一DbContext中正常工作时,是否未配置任何提供程序?

C# 为什么EF7说我没有';当ASP.net Identity在同一DbContext中正常工作时,是否未配置任何提供程序?,c#,ef-code-first,asp.net-core,entity-framework-core,C#,Ef Code First,Asp.net Core,Entity Framework Core,我刚刚开始使用ASP.NET5、MVC6和EntityFramework7进行一个实验项目。我的ASP.Net标识工作正常,但后来尝试将我自己的一些数据添加到DbContext中,并遇到了这个问题。EF7报告: 处理请求时发生未处理的异常 InvalidOperationException:未配置任何数据库提供程序。 通过覆盖数据库中的OnConfigurang来配置数据库提供程序 设置时,DbContext类或AddDbContext方法中的 服务 Microsoft.Data.Entity.

我刚刚开始使用ASP.NET5、MVC6和EntityFramework7进行一个实验项目。我的ASP.Net标识工作正常,但后来尝试将我自己的一些数据添加到DbContext中,并遇到了这个问题。EF7报告:

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

InvalidOperationException:未配置任何数据库提供程序。 通过覆盖数据库中的OnConfigurang来配置数据库提供程序 设置时,DbContext类或AddDbContext方法中的 服务

Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)堆栈查询Cookie头

InvalidOperationException:未配置任何数据库提供程序。 通过覆盖数据库中的OnConfigurang来配置数据库提供程序 设置时,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());
    }
现在,当我运行web应用程序时,我可以注册一个用户帐户并登录,EF创建数据库,创建标识表并用用户数据填充它们。还创建了products表,因此在某些级别上,EF显然能够使用
ApplicationDbContext
并找到一个用于创建数据库和模式的提供者

然而,当我试图访问我的产品控制器时,它使用了
ProductsResposition
,EF会抱怨-即使在这两种情况下都使用了
ApplicationDbContext
,并用于创建数据库


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

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

DbContext有多个构造函数,您使用的是空构造函数,而空构造函数没有配置它

最好通过如下方式将其注入构造函数:

 public ApplicationUnitOfWork(ApplicationDbContext context)
 {
    dbContext = context;
    Products = new ProductRepository(dbContext);
 }
您的代码显示ApplicationDbContext已向DI注册,Identity正在使用注入的ID,但您没有,因为您自己使用无参数构造函数更新了它

您还应该注册ApplicationUnitOfWork,以便将其注入:

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();
services.addScope();

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

DbContext有多个构造函数,您使用的是空构造函数,而空构造函数没有配置它

最好通过如下方式将其注入构造函数:

 public ApplicationUnitOfWork(ApplicationDbContext context)
 {
    dbContext = context;
    Products = new ProductRepository(dbContext);
 }
您的代码显示ApplicationDbContext已向DI注册,Identity正在使用注入的ID,但您没有,因为您自己使用无参数构造函数更新了它

您还应该注册ApplicationUnitOfWork,以便将其注入:

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();
services.addScope();

让我看看我是否理解正确。。。你是说我不应该创建自己的DbContext实例,对吗?框架将“只知道”如何创建它?对,所有这些服务。*代码正在DI容器中配置东西,以便DI能够注入它。您一直都在使用依赖项注入,即如果您的控制器需要ApplicationUnitOfWork的实例,您还应该将其添加到服务和控制器的构造函数中,以便它也可以被注入,我不是说永远不会,因为可能会有边缘情况下,您自己创建一个DbContext是有意义的,但总的来说,你不应该自己创造一个完全符合我想要的工作方式的。事实上,看看你的例子,我不知道为什么我没有这样做。我想这对我来说是不透明的,配置是在设置D.I.容器,而我试图从简单开始并以增量方式扩展。如果有任何情况下确实需要新建DbContext,您可能会使用不同的构造函数,如中所示,但最好不要使用,除非您有特定的原因让我看看我是否正确理解了这一点。。。你是说我不应该创建自己的DbContext实例,对吗?框架将“只知道”如何创建它?对,所有这些服务。*代码正在DI容器中配置东西,以便DI能够注入它。您一直都在使用依赖项注入,即如果您的控制器需要ApplicationUnitOfWork的实例,您还应该将其添加到服务和控制器的构造函数中,以便它也可以被注入,我不是说永远不会,因为可能会有边缘情况下,您自己创建一个DbContext是有意义的,但总的来说,你不应该自己创造一个完全符合我想要的工作方式的。事实上,看看你的例子,我不知道为什么我没有这样做。我想这对我来说是不透明的,配置是在设置D.I.容器,我试图从简单开始并以增量方式扩展。如果确实有需要新建DbContext的情况,您可以使用不同的构造函数,如中所示,但最好不要使用,除非您有特定的原因