C# 实体框架核心运行种子

C# 实体框架核心运行种子,c#,entity-framework-core,C#,Entity Framework Core,我使用EF Core创建AppDBContext和AppDbContextSeed: AppDbContextSeed public class AppDbContextSeed { private readonly AppDbContext _dbContext; private UserManager<AppUser> _userManager; private RoleManager<AppRole> _roleManager; p

我使用EF Core创建
AppDBContext
AppDbContextSeed

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();
    }
}
公共类AppDbContextSeed
{
私有只读AppDbContextu dbContext;
私人用户管理器(UserManager);;
私人角色经理(RoleManager);;
公共AppDbContextSeed(AppDbContext、UserManager、UserManager、,
角色经理(角色经理)
{
_dbContext=dbContext;
}
公共异步任务种子()
{
...
wait_dbContext.saveChangesSync();
}
}
Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<AppDbContextSeed>();
}
public void配置服务(IServiceCollection服务)
{
services.AddTransient();
}
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();
}
publicstaticvoidmain(字符串[]args)
{
var host=BuildWebHost(args);
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
var appDbContextSeed=services.GetService();
appDbContextSeed.Seed().Wait();
}
捕获(例外情况除外)
{
var logger=services.GetService();
logger.LogError(例如,“对数据库进行种子设定时发生错误”);
}
}
host.Run();
}

当我运行
add migration
update database
时,不会将
appDbContextSeed
中的数据插入数据库。我做错了什么?

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

这是功能文档的摘录:

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

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

看起来还可以,但与更新数据库的(预期)关系是什么?这是在启动时运行的,您需要检查每次是否需要播种。感谢您对我的帮助(如)