Я создавал веб-API с. NET Core, используя Entity Framework Core. Когда я настраивал проект, я понял, что у меня есть два метода со строкой соединения в классе Startup
. Метод ConfigureServices
en Configure
.
ConfigureServices
должен был создать миграцию моделей.
Configure
- 'pu sh' миграций в базу данных.
Я пытался сделать поле DbContextOptionsBuilder<Context>
для доступа к нему обоими методами, чтобы у меня было только одно место, где установлена строка подключения. Но, вероятно, я не реализовывал этот метод слишком хорошо, потому что команда Update-Database завершилась неудачно с:
ОШИБКА: для этого DbContext не настроен поставщик базы данных
Тогда я подумал: " В контексте также есть метод OnConfiguring
, который вызывается только для каждого экземпляра создаваемого контекста. Может быть, я должен поставить Database.Migrate()
функция там?"
Теперь я запутался, где создать экземпляр строки подключения в многоуровневой архитектуре, как вы это делаете? И вы установили строку подключения в одном месте, или несколько? Некоторые аргументы, может быть?
А куда перенести базу данных? Это лучше сделать в методе OnConfiguring
класса DbContext
?
Мое решение :
public class Startup
{
public IConfiguration Configuration { get; }
private readonly DbContextOptionsBuilder<FactVoiceContext> _dbContextOptionsBuilder;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
_dbContextOptionsBuilder = new DbContextOptionsBuilder<FactVoiceContext>()
.UseSqlServer(Configuration["DATABASE_CONNECTIONSTRING"]);
}
public void ConfigureServices(IServiceCollection services)
{
//Necessary for migrations..
services.AddDbContext<FactVoiceContext>( ctx =>
ctx.UseSqlServer(Configuration["DATABASE_CONNECTIONSTRING"]));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Just to push migration to database TODO: needs to be better
using (var context = new FactVoiceContext(_dbContextOptionsBuilder.Options))
{
context.Database.Migrate();
}
}
}
Это не сработало : ошибка поставщика базы данных
public void ConfigureServices(IServiceCollection services)
{
//Necessary for migrations..
services.AddDbContext<FactVoiceContext>( ctx => ctx = _dbContextOptionsBuilder.Options);
}
ОБНОВЛЕНИЕ: Я заметил, что создание экземпляра контекста создается несколько раз в жизненном цикле моего приложения, это означает, что это, вероятно, не лучшее место для выполнения миграции.