Asp.Net Core 2使用In Memory数据库进行Prototyping获取无法解析作用域服务

时间:2017-10-03 14:33:14

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

我正在使用Asp.Net Core 2和Entity Framework Core 2,使用代码优先开发。我正在尝试设置一个在startup.cs中调用的内存数据库,所以我不必担心是否有人更改了模型,然后因为我还在进行原型设计而不得不更新数据库。我试图关注的文章是https://stormpath.com/blog/tutorial-entity-framework-core-in-memory-database-asp-net-core

我可以让文章在Core 1中运行,然后如果我将软件包升级到核心2之后仍然可以工作,但我目前正在处理的项目已经在核心2中,我一直遇到错误试试打电话 var context = app.ApplicationServices.GetService<ApiContext>();。我得到的错误是

  

System.InvalidOperationException:'无法从根提供程序解析作用域服务'TestWebsite.DA.Repositories.ApiContext'。'

该异常中的消息是。

  

无法从根提供程序解析作用域服务“TestWebsite.DA.Repositories.ApiContext”。

我在startup.cs中更改的代码如下所示。

    public void ConfigureServices(IServiceCollection services)
    {
        AutoMapperConfiguration.Configure();
        services.AddDbContext<ApiContext>(opt => opt.UseInMemoryDatabase("TestDatabase"));
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }


        var context = app.ApplicationServices.GetService<ApiContext>();
        AddTestData(context);

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

我想知道我所关注的文章是否是在实体核心2中执行此操作的最佳方式,或者是否有更好的方法以及是否有更好的方式。

1 个答案:

答案 0 :(得分:9)

IServiceProvider serviceProvider注入到configure方法中,使其签名如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)

然后您应该能够:

var context = serviceProvider.GetService<ApiContext>();