Заполнение БД в EF Core 9
В EF 9 появились методы UseSeeding и UseAsyncSeeding, которые предоставляют удобный способ заполнения базы данных начальными данными. Эти методы предоставляют одно чёткое место, где может быть размещён весь код заполнения данных. Более того, код внутри методов UseSeeding и UseAsyncSeeding защищён механизмом блокировки миграции для предотвращения проблем с параллелизмом.
Новые методы заполнения вызываются как часть операции EnsureCreated, Migrate и команды dotnet ef database update, даже если нет никаких изменений модели и не были применены миграции. Настройку методов можно произвести в OnConfiguring:
protected override void OnConfiguring(
DbContextOptionsBuilder builder)
=> builder
.UseSqlServer(…)
.UseAsyncSeeding(async (ctx, _, ct) =>
{
var testBlog = await ctx
.Set<Blog>()
.FirstOrDefaultAsync(b =>
b.Url == "http://test.com", ct);
if (testBlog == null)
{
ctx.Set<Blog>()
.Add(new Blog { Url = "http://test.com" });
await ctx.SaveChangesAsync(ct);
}
});
Замечание: если приложение запускалось ранее, база данных может уже содержать тестовые данные (которые были бы добавлены при первой инициализации контекста). Поэтому UseSeeding (UseAsyncSeeding) должен проверять, существуют ли данные, прежде чем пытаться заполнить базу. Этого можно добиться, выполнив простой запрос, как в примере выше.
Источник: https://learn.microsoft.com/en-us/ef/core/modeling/data-seeding