实体框架核心运行种子

时间:2018-07-06 06:57:35

标签: c# entity-framework-core

我使用EF Core创建AppDBContextAppDbContextSeed

AppDbContextSeed

public class AppDbContextSeed
{
    private readonly AppDbContext _dbContext;
    private UserManager<AppUser> _userManager;
    private RoleManager<AppRole> _roleManager;

    public AppDbContextSeed(AppDbContext dbContext, UserManager<AppUser> userManager,
        RoleManager<AppRole> roleManager)
    {
        _dbContext = dbContext;
    }

    public async Task Seed()
    {
        ...
        await _dbContext.SaveChangesAsync();
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<AppDbContextSeed>();
}

program.cs

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var appDbContextSeed = services.GetService<AppDbContextSeed>();
            appDbContextSeed.Seed().Wait();
        }
        catch (Exception ex)
        {
            var logger = services.GetService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database");
        }
    }

    host.Run();
}

当我运行add-migrationupdate-database时,没有将appDbContextSeed中的数据插入数据库。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您将种子执行放在仅在应用程序启动时运行的Main方法上。如果希望在执行update-database命令的同时执行种子方法,则需要遵循EF Core 2.1中的数据种子新功能。该功能为实体配置HasData添加了新方法,可让您添加一些初始数据。

这是Data Seeding功能文档的摘录:

  

数据播种允许提供初始数据以填充数据库。   与EF6中不同,在EF Core中,种子数据与实体相关联   类型作为模型配置的一部分。然后,EF Core迁移可以   自动计算需要执行哪些插入,更新或删除操作   在将数据库升级到模型的新版本时应用。

我建议您阅读文档以了解如何使用该新功能。