Не удается устранить эту ошибку: «Для этого DbContext не настроен поставщик базы данных» - PullRequest
0 голосов
/ 22 января 2020

Я недавно вернулся к ASP. Net после долгого перерыва и экспериментировал с разработкой веб-приложений с использованием Core 2.1.

Visual Studio 2019

Я следовал одному из руководств по началу работы на веб-сайте Microsoft, и у меня возникли проблемы с поставщиком данных для строки подключения к SQLExpress.

Я получаю сообщение об ошибке «Для этого DbContext не настроен поставщик базы данных», когда я пытаюсь получить доступ к SQLExpress.

Полная ошибка

An unhandled exception occurred while processing the request.
InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)

Stack Query Cookies Headers
InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)
Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
Microsoft.EntityFrameworkCore.DbContext.get_Model()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.get_EntityType()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.get_EntityQueryable()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.System.Linq.IQueryable.get_Provider()
Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql<TEntity>(IQueryable<TEntity> source, RawSqlString sql, object[] parameters)
SQL_Connection_2.Pages.ContactModel.OnGet() in Contact.cshtml.cs
Microsoft.AspNetCore.Mvc.RazorPages.Internal.ExecutorFactory+VoidHandlerMethod.Execute(object receiver, object[] arguments)
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeHandlerMethodAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeNextPageFilterAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Rethrow(PageHandlerExecutedContext context)
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Startup.cs

public void ConfigureServices(IServiceCollection services) {
            services.Configure<CookiePolicyOptions>(options => {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddDbContext<ConfigurationContext>(options => {
                options.UseSqlServer(Configuration.GetConnectionString("MyConnection"));
            });
        }

appsettings. json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MyConnection": "server=.\\SQLExpress;database=WebApp_Test;trusted_connection=true;"
  }
}

ConfigurationContext.cs

public class ConfigurationContext:DbContext {

        public ConfigurationContext() { }
        public ConfigurationContext(DbContextOptions options) : base(options) { }


        public DbSet<Person> Persons { get; set; }

    }

Если я изменяю код в ConfigurationContext.cs на (ниже), все работает, но это игнорирует строку подключения в appsettings.json, поэтому не похоже, что services.AddDbContext выполняется в файле Startup.cs.

public class ConfigurationContext : DbContext {

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
            optionsBuilder.UseSqlServer(@"Server=.\SQLExpress;Database=WebApp_Test;Trusted_Connection=True;MultipleActiveResultSets=true;");
        }

    }

Может кто-нибудь дать совет, как это исправить? В идеале я хочу, чтобы строка подключения была настроена в * 1 041 * file.

Я потратил много часов, пытаясь это исправить, ища момент открытия и изучения.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Startup.cs, добавить ConnectionService.Set

public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        ConnectionService.Set(configuration);
    }

ConnectionService.cs

public static string connstring = "";
public static string Set(IConfiguration config)
    {
        connstring = config.GetConnectionString("MyConnection");
    }

ConfigurationContext.cs

public class ConfigurationContext : DbContext {

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        optionsBuilder.UseSqlServer(ConnectionService.connstring);
    }

}
0 голосов
/ 22 января 2020

Попробуйте использовать строку подключения, которую вы использовали в вашем методе OnConfiguring, поскольку то, что вы опубликовали, отличается.

Как это -

  "ConnectionStrings": {
    "MyConnection": "Server=.\SQLExpress;Database=WebApp_Test;Trusted_Connection=True;MultipleActiveResultSets=true;"
  }
...