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

C S*_*ith 4 c# entity-framework-core asp.net-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?}");
        });
    }
Run Code Online (Sandbox Code Playgroud)

我想知道我所关注的文章是否是在实体核心2中实现它的最佳方式,或者是否有更好的方法,如果有更好的方式可能是什么.

Mar*_*rry 10

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
Run Code Online (Sandbox Code Playgroud)

那么你应该能够做到:

var context = serviceProvider.GetService<ApiContext>();
Run Code Online (Sandbox Code Playgroud)