我正在使用EntityFrameworkCore 2.0.0-preview2-final,我想将ApplicationDbContext注入Startup类中的Configure方法。
这是我的代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context)
{
// rest of my code
}
但是当我运行我的应用程序时,我收到一条错误消息:
System.InvalidOperationException:无法解析作用域服务 来自root provider的'ProjectName.Models.ApplicationDbContext'。
这也是我在ConfigureServices方法中的代码:
services.AddDbContext<ApplicationDbContext>(options =>
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
}
else
{
options.UseSqlite("Data Source=travelingowe.db");
}
});
您知道我该如何解决这个问题?
答案 0 :(得分:9)
这适用于2.0.0 RTM。我们已经做到了这一点,因此在调用Configure期间有一个范围,因此您最初编写的代码将起作用。有关详细信息,请参阅https://github.com/aspnet/Hosting/pull/1106。
答案 1 :(得分:3)
EF Core DbContext
注册了scoped生活方式。在ASP本机DI容器范围连接到IServiceProvider
的实例。通常,当您使用Controller中的DbContext
时没有问题,因为ASP为每个请求创建新范围(IServiceProvider
的新实例),然后使用它来解析此请求中的所有内容。但是,在应用程序启动期间,您没有请求范围,因此您应该自己创建范围。你可以这样做:
var scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
using (var scope = scopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
// rest of your code
}
修改强>
正如davidfowl所说,这将在2.0.0 RTM中起作用,因为将为Configure
方法创建范围的服务提供者。