#c# #asp.net-core #entity-framework-core
#c# #asp.net-core #сущность-фреймворк-ядро
Вопрос:
Я пытаюсь получить то, что DbContext
я зарегистрировал с помощью опций через services.AddDbContext(...)
поставщика услуг проекта, но при вызове configuration.Get<ModelContext>
это не может быть сконструировано, поскольку опции, по-видимому, не были предоставлены, и, следовательно, также не указан поставщик базы данных.
Я использую ASP.NET Ядро 2.2 с Entity Framework Core 2.2.3 и my DbContext
определены в отдельном проекте.
Мой DbContext
:
public class ModelContext : DbContext
{
public ModelContext(DbContextOptions<ModelContext> options) : base(options) { }
public ModelContext() { }
}
Я не переопределял OnConfiguring(DbContextOptionsBuilder)
в ModelContext
.
public class StartUp
{
public void ConfigureServices(IServiceCollection services)
{
public services.AddEntityFrameworkSqlServer();
services.AddDbContext<ModelContext>(options => options.UseSqlServer(modelConnectionString));
}
}
В контроллере (или где угодно на самом деле) Я вызываю, public HomeController(IConfiguration configuration) => _modelContext = configuration.Get<ModelContext>();
который выдает неожиданное исключение.
Что я конкретно получаю, так это InvalidOperationException
с сообщением:
Ни один поставщик базы данных не был настроен для этого DbContext. Поставщик может быть настроен путем переопределения DbContext.Методом OnConfiguring или с помощью AddDbContext у поставщика прикладных услуг. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext.
Согласно документации, которую я прочитал, и примерам, которые я просмотрел, ModelContext
должен быть создан с параметрами, которые я определил при вызове AddDbContext<ModelContext>
. Является ли Get
метод неправильным для использования?
Комментарии:
1.
configuration.Get<ModelContext>();
? Что именно это заconfiguration
переменная? Контроллер должен ожидать, что ModelContext будет введен в него2. Отредактировано для наглядности.
configuration
являетсяIConfiguration
.
Ответ №1:
После настройки контекстной службы БД в методе «ConfigureServices» из файла Startup.cs с чем-то вроде этого :
var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<BottinContext>(options => options.UseSqlServer(connectionString)) ;
Просто добавьте :
ModelContext db
задайте параметр конструктору вашего контроллера и позвольте волшебству DI произойти.
Если у вас много контроллеров и вы хотите упростить работу, вы можете использовать базовый конструктор, который содержит контекст БД
public BaseController(ModelContext context /* as well as other injections */)
{
_db = context;
}
internal ModelContext _db;
Комментарии:
1. Ага, отлично работает, спасибо! Вероятно, я просто слеп, поэтому я не нашел его, но у вас случайно все еще есть ссылка на документацию, в которой обсуждается эта функция?
2. смотрите: learn.microsoft.com/en-us/ef/core/miscellaneous/…
Ответ №2:
вы пытаетесь получить экземпляр DbContext неправильным способом. Метод Get не используется для получения экземпляра объекта DbContext, который вы зарегистрировали в контейнере внедрения зависимостей. если вы хотите получить экземпляр вашего класса DbContext, который вы зарегистрировали, вы можете внедрить его, например, с помощью конструктивного внедрения
public class RepositoryWrapper : IRepositoryWrapper
{
private readonly ModelContext _modelContext;
public RepositoryWrapper(ModelContext modelContext)
{
_modelContext= modelContext;
}
}
это то, что я делаю в своем проекте.