实体框架核心种子数据

时间:2020-08-07 16:21:26

标签: entity-framework entity-framework-core

  • EF核心版本3.1.4。
  • SQL Server 2014。

从数据库中删除数据后,如何使EF Core重新种子化?它将直接在数据库中删除,而不是通过EF核心迁移。

我最新的迁移文件具有以下内容:

migrationBuilder.InsertData(
            table: "Person",
            columns: new[] { "ID", "Name" },
            values: new object[]
            {
                { 1, "Tom Watson" }
            });

运行Update-Database后,将创建ID为1的人员,然后有人在SQL Server中运行delete from Person。此时,我想重新播种数据。运行Update-Database不会将Person重新插入数据库。

我当前的解决方案是删除我的modelBuilder.Entity<Person>().HasData(...)代码,创建新的迁移,然后重新添加该代码并创建另一个迁移,最后是Update-Database。这是一个丑陋的解决方案,会造成不必要的迁移。

有什么想法吗?显然,我可以在数据库上进行插入,但是我想通过EF软件包管理器控制台进行插入,因为我拥有的种子数据比该记录多得多。

1 个答案:

答案 0 :(得分:0)

根据Microsoft documentation,您可以使用这样的种子数据。

在这种情况下,每次运行程序时都会检查InitializePersons,如果数据库中没有记录,则会将新记录再次保存在数据库中。

public static void Main(string[] args)
{
     var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<DbContext>();
            DbInitializer.InitializePersons(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}
public static class DbInitializer
{
    public static void InitializePersons(DbContext context)
    {
        context.Database.EnsureCreated();
        context.Persons.Add(new Person() { Id = 1, Name = "Tom Watson" });
        context.SaveChanges();
    }
}