ASP.NET Core: как передать строку подключения в DBContext?

Есть рабочий пример: https://www.codeproject.com/Articles/3132485/CRUD-Operation-using-ASP-NET-CORE-2-2-and-React-Re

Я хотел бы заменить жестко заданную строку подключения в сборке строкой из config. Это в исходном примере:

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

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

    public virtual DbSet<Contacts> Contacts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            //#warning To protect potentially sensitive information 
            //in your connection string, you should move it out of source code. 
            //See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance 
            //on storing connection strings.
            optionsBuilder.UseSqlServer("Server=yourservername ;
                                         Database=ContactDB;Trusted_Connection=True;");
       }
    }
}

Я добавил код:

public void ConfigureServices(IServiceCollection services)
{
    //...

    services.AddDbContext<ContactDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString(nameof(ContactDBContext))));//<------?

    //...
}

Строка читается нормально, но не используется. Жестко запрограммированная строка все еще используется (см. первый фрагмент кода).

Я использую контекст, например

public class ContactService : IContactService
{
    public async Task<List<ContactModel>> GetContacts()
    {
        using (ContactDBContext db = new ContactDBContext())
        {

        //...

Как передать строку подключения из приложения в контекст EF?

Удалите код из OnConfiguring, который переопределяет набор соединений при запуске.

Nkosi 30.05.2019 15:00

Вы перезаписываете строку подключения, устанавливая ее в OnConfiguring, так как это происходит после ConfigureServices.

Heretic Monkey 30.05.2019 15:00

Ах, убрать код или вообще убрать функцию OnConfiguring?

ZedZip 30.05.2019 15:03

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

Nkosi 30.05.2019 15:04

Сделал 2 теста: удалил код в OnConfiguring, удалил функцию, запустил приложение - та же проблема.

ZedZip 30.05.2019 15:06

Я бы предложил удалить OnConfiguring и протестировать снова. Если это не удается, проблема заключается в конструкторе по умолчанию.

Nkosi 30.05.2019 15:06

Пожалуйста, смотрите мой предыдущий комментарий, не исправлено. Как решить проблему с конструктором по умолчанию?

ZedZip 30.05.2019 15:08

Просто удалите конструктор по умолчанию

Nkosi 30.05.2019 15:09

Давайте продолжить обсуждение в чате.

ZedZip 30.05.2019 15:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
9
4 700
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы создаете экземпляр контекста вручную, конфигурация, применяемая при запуске, не внедряется в контекст, а вместо этого используется метод OnConfiguring.

Вот почему ваша конфигурация при запуске не применяется.

Рефакторинг контекста для удаления конструктора по умолчанию и OnConfiguring

public partial class ContactDBContext : DbContext {
    public ContactDBContext(DbContextOptions<ContactDBContext> options)
        : base(options) {
    }

    public virtual DbSet<Contacts> Contacts { get; set; }

    }
}

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

public class ContactService : IContactService {
    ContactDBContext db;

    public ContactService (ContactDBContext db) { 
        this.db = db
    } 

    public async Task<List<ContactModel>> GetContacts() {
        var contacts = db.Contacts;

        //...convert to models

        //...
    }
}

Конфигурация, применяемая при запуске, теперь должна включаться, когда контейнер разрешает контекст для внедрения.

Ссылка Настройка DbContext

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