ASP.NET Core: как передать строку подключения в DBContext? - PullRequest
2 голосов
/ 30 мая 2019

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

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

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?

1 Ответ

1 голос
/ 30 мая 2019

Поскольку вы вручную создаете экземпляр контекста, конфигурация, применяемая при запуске, не внедряется в контекст, а вместо этого использует метод 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

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