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

问题描述 投票:4回答:1

我正在使用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中实现它的最佳方式,或者是否有更好的方法,如果有更好的方式可能是什么。

c# asp.net-core entity-framework-core
1个回答
9
投票

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

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

那么你应该能够做到:

var context = serviceProvider.GetService<ApiContext>();
© www.soinside.com 2019 - 2024. All rights reserved.