Используйте settings.json в библиотеке классов Net Core с миграциями EF Core - PullRequest
0 голосов
/ 08 ноября 2018

В библиотеке классов NET Core 2.1 у меня есть Entity Framework Core 2.1 DbContext:

public class AppContext : IdentityDbContext<User, Role, Int32> {

  public AppContext(DbContextOptions options) : base(options) { }

}

Для запуска миграций в библиотеке классов мне нужно было добавить следующее:

public class ContextFactory : IDesignTimeDbContextFactory<Context> {

  public Context CreateDbContext(String[] args) {

    DbContextOptionsBuilder builder = new DbContextOptionsBuilder<Context>();

    builder.UseSqlServer(@"Server=localhost;Database=db;User=sa;Password=pass;");

    return new Context(builder.Options);

  } 

}

С этим я могу запускать команды библиотеки классов, такие как:

dotnet ef migrations add "InitialCommit"
dotnet ef database update

Но как переместить строку подключения в файл settings.json в библиотеке классов?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

IDesignTimeDbContextFactory, как следует из названия, предназначен исключительно для разработки. Обычно нет необходимости выводить строку подключения, потому что она должна быть довольно статичной даже в командной среде. Тем не менее, во всяком случае, вы должны хранить его в секретах пользователя, потому что опять же, это только для разработки. Использование пользовательских секретов не допускает использование строки подключения в вашем контроле над источниками, поэтому разработчики в вашей команде не наступают друг другу на ноги со строками подключения друг друга.

var config = new ConfigurationBuilder()
    .AddUserSecrets()
    .Build();

var connectionString = config.GetConnectionString("Foo");
0 голосов
/ 08 ноября 2018

Реализация IDesignTimeDbContextFactory<> запускается через процесс утилиты EF. Это обычное консольное приложение, в котором вы можете использовать Console.Write() и Console.Read() для взаимодействия с пользователем, выполняющим миграции и обновления. Это позволяет пользователю запрашивать ввод строки подключения во время обновления.

public class Builder : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        Console.Write("Enter your connection string: ");
        var conStr = Console.ReadLine();

        var options = new DbContextOptionsBuilder<AppContext>().UseSqlServer(conStr).Options;

        return new AppContext(options);
    }
}
0 голосов
/ 08 ноября 2018

Вы можете настроить DbContextOptions в классе запуска и затем вставить его в контекст. В классе запуска вы можете получить строку подключения из конфигурации.

Startup.cs:

  public void ConfigureServices(IServiceCollection services)
        {                        
        services.AddDbContext<Context>
        (options=> options.UseSqlServer(Configuration["ConnectionString:DefaultConnection"]));

        ....
        }

Добавить строку подключения к appsettings.json:

  "ConnectionString": {
    "DefaultConnection": "your connection string"
  },
...