C# 为什么EF7说我没有';当ASP.net Identity在同一DbContext中正常工作时,是否未配置任何提供程序?
我刚刚开始使用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方法中的 服务 以下是我的配置方法: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.
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的情况,您可以使用不同的构造函数,如中所示,但最好不要使用,除非您有特定的原因