InvalidOperationException: невозможно разрешить службу для типа «OESAC.Data.MyDbContext» при попытке активировать «OESAC.Pages.Courses.IndexModel». - PullRequest
0 голосов
/ 30 марта 2019

Я искал решения StackOverflow и весь мир. Уверен, если бы это была змея, она бы меня укусила. Веб-приложение Razor Pages, VS 2017, запускается и показывает домашнюю страницу. Я хочу показать страницу Pages / Courses / Index.chstml, связанную с таблицей Courses. Когда я нажимаю на ссылку «Курсы», то все взрывается.

Вот мой класс "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)

1 Ответ

0 голосов
/ 31 марта 2019

Хорошо, я начал разбирать ошибку и получил некоторую помощь.

Я нашел это упомянутое и добавил его в свой Startup.cs ConfigureServices

Все в .NET Core построено на внедрении зависимостей, а не на использовании статических экземпляров таких вещей, как ConfigurationManager. Вы можете сделать это несколькими разными способами. Сначала нужно зарегистрировать ваш DbContext в Startup.cs ConfigureServices, используя что-то вроде этого:

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

Вот местоположение вопроса и ответа для вышеуказанного: Как передать строку подключения из appsettings. [Name] .json в DbContext в .NET Core?

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

Второй элемент, который мне пришлось добавить, это то, что я нашел в другой теме (я изменил имя контекста, чтобы отразить мой MyDbContext):

Как говорится в сообщении об ошибке, если вы настраиваете MyDbContext через AddDbContext, вам также нужно добавить конструктор, который получает параметр типа DbContextOptions, в ваш класс MyDbContext, как показано ниже

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

Если вы этого не сделаете, ASP.Net Core не сможет внедрить конфигурацию, заданную вами с помощью AddDbContext. (помните ответ в первом найденном мной URL-адресе «Все в .NET». Ядро построено вокруг внедрения зависимости вместо использования статических экземпляров "). Примечание для себя: узнайте, что такое инъекция зависимости LOL

Пойди разберись. Вы могли бы подумать, что Леса сделали бы все это. Что за голова скребет.

Я снова обнаружил, что здесь, в StackOverflow:

AddDbContext был вызван с конфигурацией, но тип контекста 'MyContext' объявляет только конструктор без параметров?

...