Заполнение переменных данных с помощью EF Core 2.2 - PullRequest
0 голосов
/ 18 декабря 2018

Во всех примерах и статьях, которые я видел о заполнении данных с помощью EF Core, все данные жестко запрограммированы.Мне нужно заполнить некоторые данные, где их часть является переменной.Моя модель:

public class Customer
{
    [Key]
    public Guid Id { get; set; }

    public string ApiKey { get; set; }
}

В частности, я хочу, чтобы ApiKey содержал различное значение каждый раз, когда выполняется начальная операция.Таким образом, я получаю разные значения для каждой среды (разработка, контроль качества, производство).

Я создал метод для генерации уникального значения и добавил следующее к моему OnModelCreating методу.

modelBuilder.Entity<Customer>().HasData(new Customer
{
    Id = Guid.NewGuid(),
    ApiKey = GenerateApiKey()
});

Проблема, как вы, наверное, догадались, заключается в том, что вызов GenerateApiKey происходит при создании миграции, поэтому значение, сгенерированное GenerateApiKey, эффективно жестко закодировано в вызове InsertData.

migrationBuilder.InsertData(
    table: "Customers",
    columns: new[] { "Id", "ApiKey" },
    values: new object[] 
    { 
        new Guid("bcde0c82-ad26-47fb-bd5f-1ad552d2b8f0"),
        "56+hhUTjPwz0FM9uwYg19M5rfq6aUgmNde15Frn6TFY=" 
    });

В EF 6.x я выполнил это с помощью Seedметод моего DbMigrationsConfiguration подкласса.

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

1 Ответ

0 голосов
/ 18 декабря 2018

Вы всегда можете запустить метод семени, как только ваш хост будет готов, вот так (вот как я делаю это в 2.1):

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Seed().Run();
}

...

public static class WebHostExtensions
{
    public static IWebHost Seed(this IWebHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            var loggerFactory = services.GetRequiredService<ILoggerFactory>();
            var context = services.GetRequiredService<MsbContext>();

            // do whatever you need here with your data before migrations
            ...
            context.Database.Migrate();

            // do whatever you need here with your data after migrations
            ...
        }
    }
}
...