Заполнение данных с помощью Entity Framework 3.0 с моделью или миграцией? - PullRequest
0 голосов
/ 05 ноября 2019

С последними версиями ASP.NET Core 3 и EF Core 3 я хочу заполнить данные, как это было в предыдущей версии EF. Я заметил, что в документах Microsoft они указывают на этот код в качестве примера начального заполнения.

https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core/Modeling/DataSeeding/Migrations

Он обновляет миграцию следующим кодом:

        migrationBuilder.InsertData(
            table: "Posts",
            columns: new[] { "PostId", "BlogId", "Content", "Title", "AuthorName_First", "AuthorName_Last" },
            values: new object[] { 1, 1, "Test 1", "First post", "Andriy", "Svyryd" });

        migrationBuilder.InsertData(
            table: "Posts",
            columns: new[] { "PostId", "BlogId", "Content", "Title", "AuthorName_First", "AuthorName_Last" },
            values: new object[] { 2, 1, "Test 2", "Second post", "Diego", "Vega" });

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

Есть ли лучший способ обработки данных заполнения в EF Core 3? Может быть, с помощью dbContext или как-то поместить что-то в сам класс модели?

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете заполнить данные в Program.cs. Например:

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
    {
        await SeedData.EnsureSeedData(scope.ServiceProvider);
    }

    host.Run();
}

Создайте класс SeedData и напишите в нем свою логику заполнения.

public static async Task EnsureSeedData(IServiceProvider provider)
{
    var dbContext = provider.GetRequiredService<MyDbContext>();
    await dbContext.Database.MigrateAsync();

    if(!await dbContext.MyTables.AnyAsync())
    {
        await dbContext.MyTables.AddAsync(new MyTable {})
        await dbContext.SaveChangesAsync();
    }
}
...