Есть рабочий пример: 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
, так как это происходит после ConfigureServices
.
Ах, убрать код или вообще убрать функцию OnConfiguring?
Также возможно, что из-за того, что у вас есть конструктор по умолчанию, параметры не передаются в контекст, и поэтому он будет использовать OnConfiguring
, потому что в этом случае параметры построителя не настроены.
Сделал 2 теста: удалил код в OnConfiguring, удалил функцию, запустил приложение - та же проблема.
Я бы предложил удалить OnConfiguring
и протестировать снова. Если это не удается, проблема заключается в конструкторе по умолчанию.
Пожалуйста, смотрите мой предыдущий комментарий, не исправлено. Как решить проблему с конструктором по умолчанию?
Просто удалите конструктор по умолчанию
Давайте продолжить обсуждение в чате.
Поскольку вы создаете экземпляр контекста вручную, конфигурация, применяемая при запуске, не внедряется в контекст, а вместо этого используется метод 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
Удалите код из
OnConfiguring
, который переопределяет набор соединений при запуске.