Какое место лучше всего в коде для строки подключения и для переноса базы данных? - PullRequest
0 голосов
/ 18 января 2020

Я создавал веб-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);
}

ОБНОВЛЕНИЕ: Я заметил, что создание экземпляра контекста создается несколько раз в жизненном цикле моего приложения, это означает, что это, вероятно, не лучшее место для выполнения миграции.

...