【问题标题】:InvalidOperationException: Unable to resolve service for type 'OESAC.Data.MyDbContext' while attempting to activate 'OESAC.Pages.Courses.IndexModel'InvalidOperationException:尝试激活“OESAC.Pages.Courses.IndexModel”时无法解析“OESAC.Data.MyDbContext”类型的服务
【发布时间】:2019-08-21 01:38:07
【问题描述】:

我已经在 StackOverflow 和全世界搜索了解决方案。很确定如果它是一条蛇,它会咬我。 Razor Pages Web 应用程序,VS 2017,运行并显示主页。我想显示一个连接到 Courses 表的 Pages/Courses/Index.chstml 页面。当我单击“课程”链接时,一切都会爆炸。

这是我的“MyDbContext”类:

using Microsoft.EntityFrameworkCore;

namespace OESAC.Data
{
    public class MyDbContext : DbContext
    {
        public DbSet<Courses> Courses { get; set; }
        public DbSet<Sponsors> Sponsors{ get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite(@"Data source=oesac_new.db");
        }
    }
}

这是触发错误的索引文件。它位于 Pages.Courses 文件夹中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using OESAC.Data;

namespace OESAC.Pages.Courses
{
    public class IndexModel : PageModel
    {
        private readonly OESAC.Data.MyDbContext _context;

        public IndexModel(OESAC.Data.MyDbContext context)
        {
            _context = context;
        }

        public List<OESAC.Data.Courses> Courses { get;set; }

        public async Task OnGetAsync()
        {
            Courses = await _context.Courses.ToListAsync();
        }
    }
}

这是错误:

System.InvalidOperationException: Unable to resolve service for type 'OESAC.Data.MyDbContext' while attempting to activate 'OESAC.Pages.Courses.IndexModel'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DefaultPageModelActivatorProvider.<>c__DisplayClass1_0.<CreateActivator>b__0(PageContext context)
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DefaultPageModelFactoryProvider.<>c__DisplayClass3_0.<CreateModelFactory>b__0(PageContext pageContext)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.CreateInstance()
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

【问题讨论】:

    标签: sqlite dbcontext razor-pages


    【解决方案1】:

    好的,我开始分析错误并获得了一些帮助。

    我发现提到了这一点,并将其添加到我的 Startup.cs ConfigureServices

    .NET Core 中的一切都是围绕依赖注入构建的,而不是使用 ConfigurationManager 之类的静态实例。 你可以通过几种不同的方式做到这一点。 首先是在 Startup.cs ConfigureServices 中注册您的 DbContext,使用如下:

    services.AddDbContext<MyDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
    

    这里是上面的问答位置: How to pass connection string from appsettings.[name].json to DbContext in .NET Core?

    ================================================ ====

    我必须添加的第二项是我在另一个线程中找到的(我更改了上下文名称以反映我的 MyDbContext):

    正如错误所说,如果您通过 AddDbContext 配置 MyDbContext,那么您还需要将接收 DbContextOptions 类型参数的构造函数添加到 MyDbContext 类中,如下所示

    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options)
    { }
    

    如果您不这样做,ASP.Net Core 将无法注入您使用 AddDbContext 设置的配置。(请记住我找到的第一个 URL 中的答案是“. NET Core 是围绕依赖注入构建的,而不是使用静态实例”)。自我注意:了解什么是依赖注入 LOL

    去图吧。你会认为脚手架会做这一切。真是让人头疼。

    我再次在 StackOverflow 上发现了这一点:

    AddDbContext was called with configuration, but the context type 'MyContext' only declares a parameterless constructor?

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2021-04-29
      • 2020-07-01
      • 2021-02-23
      • 2020-05-18
      • 2018-06-08
      • 2018-07-07
      • 2020-08-21
      • 1970-01-01
      相关资源
      最近更新 更多