Я бился головой об стену этим и безрезультатно гуглил.
Я только что начал новый проект 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)1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(FuncNo 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.
Кто-нибудь знает, что я здесь делаю не так?
Да, как ни странно, если я это прокомментирую, вместо этого он жалуется, что нет конструктора с меньшим параметром!
Вы упомянули, что OnConfiguring закомментирован, это правильно? Или вам не хватает base.OnConfiguring (optionsBuilder); в конце метода переопределения OnConfiguring?
Также есть ли у вас в коде экземпляры, в которых вы пытаетесь использовать DatabaseDBContext в настоящее время?
Сюжет немного загустевает. Если я раскомментирую оператор OnConfiguring optionsBuilder.UseSqlServer, я могу добавить контроллер с шаблоном. Затем я могу порекомендовать инструкцию optionsBuilder.UseSqlServer, и все по-прежнему будет работать с разумным кодом, используя службы запуска AddDbContext. В качестве обходного пути такого рода работает, но это странно, поскольку кажется, что это не так, особенно при попытке добавить содержимое скаффолда.
RE: раздел OnConfiguring, я полностью закомментировал его, но даже если я просто прокомментирую строки if (! OptionsBuilder.IsConfigured), результат будет тот же. В разделе OnConfiguring у меня нет ничего, кроме того, что вы видите в моем исходном сообщении.
Попробуйте добавить этот providerName = "System.Data.SqlClient" в DBConnString.
Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...


Попробуйте добавить этот третий конструктор:
public DatabaseDBContext()
{
}
public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
: base(options)
{
}
public DatabaseDBContext(DbContextOptions options)
: base(options)
{
}
Затем установите точку останова в каждой, чтобы быть уверенным, какая из них на самом деле используется.
К сожалению, это не помогло, выдало мне ошибку на 3-м из них о том, что это неоднозначно. Спасибо, в любом случае! :) Также не уверен, почему, но ни одна из точек останова не была достигнута.
Ах да, вам придется удалить другой конструктор. Думаю, это тоже не помогло!
Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...
У меня была такая же проблема, и это решило ее для меня (установка 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 о, извините, это настраиваемый метод расширения, перенастраивающий одну из двух константных строк, содержащих либо строку подключения, либо локальную, либо рабочую. Я не знаю, помогает ли это вашей проблеме, но ошибка была исправлена, когда я указал UseSqlServer в OnConfiguring, даже если я настроил его при запуске.
Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления ей что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, потом все заработало ...
@HungryHippos отличный, нет ничего лучше этого :)
Так что я исправил, но это было действительно окольным путем. Мой новый проект изначально был основан на более старой версии ядра .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, и это сработало. После создания контроллера я снова закомментировал и все заработало.
У меня возникла эта проблема после того, как я встроил 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, поэтому ожидалось, что она будет обновлена до последней версии. Я его поменял, и все заработало!
Вы пытались удалить конструктор без параметров?