将ApplicationDbContext注入Startup中的Configure方法

时间:2017-07-21 07:08:53

标签: c# entity-framework asp.net-core .net-core entity-framework-core

我正在使用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");
            }
        });

您知道我该如何解决这个问题?

2 个答案:

答案 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方法创建范围的服务提供者。