Получение DbContext через конфигурацию с DbContextOptions - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь получить DbContext Я зарегистрировался с опциями через services.AddDbContext(...) на сервис-провайдере проекта, но при вызове configuration.Get<ModelContext> он не может быть создан, так как опции, очевидно, не были предоставлены и, следовательно, также поставщик базы данных не указан.

Я использую ASP.NET Core 2.2 с Entity Framework Core 2.2.3, и мой 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 неправильным?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

После настройки службы контекста БД в методе «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;
0 голосов
/ 01 апреля 2019

вы пытаетесь получить экземпляр dbContxt неправильно. Метод Get не используется для получения экземпляра объекта dbContext, который вы зарегистрировали в контейнере внедрения зависимостей. если вы хотите получить экземпляр вашего класса dbContext, который вы зарегистрировали, вы можете внедрить его через конструкцию, например

public class RepositoryWrapper : IRepositoryWrapper
{
        private readonly ModelContext _modelContext;


        public RepositoryWrapper(ModelContext modelContext)
        {
        _modelContext= modelContext;
        }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...