Получение DbContext через конфигурацию с помощью DbContextOptions

#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;
        }
}
  

это то, что я делаю в своем проекте.