Для этого DbContext .NET Core с SQL Server не настроен поставщик базы данных

Я бился головой об стену этим и безрезультатно гуглил.

Я только что начал новый проект ASP.NET Core MVC, я установил / обновил свои пакеты для этих двух до версии 2.2.0:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Я настроил проект на ожидание .NET Core 2.2.0.

Я могу успешно добавить свои схемы таблиц с помощью этой команды в консоли диспетчера пакетов, чтобы сформировать базу данных, поэтому я знаю, что строка подключения в порядке / работает:

Scaffold-DbContext "SERVER=Server\Instance;DATABASE=Database;UID=user;PWD=password;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables Table1, Table2, Table3

Созданный файл модели DatabaseDBContext.cs выглядит так:

public partial class DatabaseDBContext : DbContext
{
    public DatabaseDBContext()
    {
    }

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

Он также содержит метод, который работает для получения данных о моих каркасах, но не считается безопасным для производственного использования, поэтому я закомментировал это:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;");
    }
}

Я добавил эту же строку подключения в файл appsettings.json:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "DBConnString": "SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;"
  }
}

Затем я добавил DbContext в файл startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DBConnString")));
}

Попытка добавить новый контроллер с шаблоном для одной из таблиц вызывает эту ошибку:

Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory.
Attempting to figure out the EntityFramework metadata for the model and DbContext: 'TableName'

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 object in its constructor and passes it to the base constructor for DbContext.

StackTrace:
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure1 accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1 factory)

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 object in its constructor and passes it to the base constructor for DbContext.

Кто-нибудь знает, что я здесь делаю не так?

Вы пытались удалить конструктор без параметров?

Sasan 06.01.2019 16:45

Да, как ни странно, если я это прокомментирую, вместо этого он жалуется, что нет конструктора с меньшим параметром!

HungryHippos 06.01.2019 17:38

Вы упомянули, что OnConfiguring закомментирован, это правильно? Или вам не хватает base.OnConfiguring (optionsBuilder); в конце метода переопределения OnConfiguring?

eVolve 06.01.2019 17:54

Также есть ли у вас в коде экземпляры, в которых вы пытаетесь использовать DatabaseDBContext в настоящее время?

eVolve 06.01.2019 18:01

Сюжет немного загустевает. Если я раскомментирую оператор OnConfiguring optionsBuilder.UseSqlServer, я могу добавить контроллер с шаблоном. Затем я могу порекомендовать инструкцию optionsBuilder.UseSqlServer, и все по-прежнему будет работать с разумным кодом, используя службы запуска AddDbContext. В качестве обходного пути такого рода работает, но это странно, поскольку кажется, что это не так, особенно при попытке добавить содержимое скаффолда.

HungryHippos 06.01.2019 21:32

RE: раздел OnConfiguring, я полностью закомментировал его, но даже если я просто прокомментирую строки if (! OptionsBuilder.IsConfigured), результат будет тот же. В разделе OnConfiguring у меня нет ничего, кроме того, что вы видите в моем исходном сообщении.

HungryHippos 06.01.2019 21:34

Попробуйте добавить этот providerName = "System.Data.SqlClient" в DBConnString.

Karan 07.01.2019 06:04

Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...

HungryHippos 07.01.2019 13:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
8
15 596
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуйте добавить этот третий конструктор:

public DatabaseDBContext()
{
}

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

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

Затем установите точку останова в каждой, чтобы быть уверенным, какая из них на самом деле используется.

К сожалению, это не помогло, выдало мне ошибку на 3-м из них о том, что это неоднозначно. Спасибо, в любом случае! :) Также не уверен, почему, но ни одна из точек останова не была достигнута.

HungryHippos 06.01.2019 21:27

Ах да, вам придется удалить другой конструктор. Думаю, это тоже не помогло!

Michael Ceber 07.01.2019 09:28

Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...

HungryHippos 07.01.2019 13:02

У меня была такая же проблема, и это решило ее для меня (установка UseSqlServer в OnConfiguring):

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
    if (!builder.IsConfigured)
    {
        string conn = this.IsProduction ? Const.ProductionConnectionString : Const.LocalDBConnectionString;

        builder.UseSqlServer(conn);
    }

    base.OnConfiguring(builder);
}

Где вы объявляете Const.ProductionConnectionString? Я не могу вытащить его из раздела конфигурации, как в startup.cs.

HungryHippos 07.01.2019 12:25

@HungryHippos о, извините, это настраиваемый метод расширения, перенастраивающий одну из двух константных строк, содержащих либо строку подключения, либо локальную, либо рабочую. Я не знаю, помогает ли это вашей проблеме, но ошибка была исправлена, когда я указал UseSqlServer в OnConfiguring, даже если я настроил его при запуске.

SteinTheRuler 07.01.2019 12:39

Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...

HungryHippos 07.01.2019 13:02

@HungryHippos отличный, нет ничего лучше этого :)

SteinTheRuler 07.01.2019 13:26
Ответ принят как подходящий

Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...

Логика кода была озвучена выше. По-прежнему нужны были те же пакеты:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Startup.cs кажется совершенно другим, поэтому, возможно, если кто-то еще это увидит, он может попробовать обновить код startup.cs:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
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.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DatabaseDBConnString")));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Для этого пришлось добавить ссылку на startup.cs:

using Microsoft.EntityFrameworkCore;

Это было необходимо для разрешения метода AddDbContext.

После этого строительные леса работают. Итак, это исправлено, но мне потребовалось начать все заново, чтобы исправить это.

То же самое происходит с v3.0.0 preview 6. Первое, что думает Ми, это то, что скаффолдер не готов выбрать экземпляр контекста из контейнера DI. Итак, я НЕКОММЕНТИРОВАЛ переопределение OnConfiguring, и это сработало. После создания контроллера я снова закомментировал и все заработало.

Vic 19.07.2019 10:30

У меня возникла эта проблема после того, как я встроил Program.CreateWebHostBuilder в Program.Main. Пришлось извлечь обратно.

После борьбы с этой проблемой я нашел решение для нее здесь

https://github.com/aspnet/EntityFrameworkCore/issues/12331

Проблема заключалась в том, что Add-Migration ожидал CreateWebHostBuilder

public static IWebHostBuilder CreateWebHostBuilder(string[] args)

До того, как мой public static void Main(string[]) запускал WebHost без статического CreateWebHostBuilder, и после того, как я добавил статическую функцию, он работал.

Он был подключен, но эта проблема была устранена путем обновления версии фреймворка решения проекта. Например, я создал одно репозиторий ядра в версии 3.0, а позже установил в системе последнюю версию 3.1, поэтому ожидалось, что она будет обновлена ​​до последней версии. Я его поменял, и все заработало!

Другие вопросы по теме