我正在使用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中执行此操作的最佳方式,或者是否有更好的方法以及是否有更好的方式。
答案 0 :(得分:9)
将IServiceProvider serviceProvider
注入到configure方法中,使其签名如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
然后您应该能够:
var context = serviceProvider.GetService<ApiContext>();