【问题标题】:Does EF Core migrations call Startup.Configure() on add-migrationEF Core 迁移是否在添加迁移时调用 Startup.Configure()
【发布时间】:2018-02-10 06:20:56
【问题描述】:

我有一个简单的 DbContext,MyDbContext,有 2 个 DbSet:

public DbSet<User> Users { get; set; }
public DbSet<Privilege> Privileges { get; set; }

当我在 PM 控制台中运行 add-migration 时,迁移已成功生成。然后我添加了代码来播种 Privileges 表。我添加的代码在 Startup.Configure() 中:

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
    serviceScope.ServiceProvider.GetService<OneSourceDbContext>().Database.Migrate();
    serviceScope.ServiceProvider.GetService<OneSourceDbContext>().EnsureSeedData();
}

EnsureSeedData 是一个扩展方法,如下所示:

public static void EnsureSeedData(this OneSourceDbContext context)
{
    if (!context.Database.GetPendingMigrations().Any())
    {
        if (!context.Privileges.Any())
        {
                context.Privileges.Add(new Models.Privilege { Name = "Add/Edit" });
                context.SaveChanges();
            }
        }
    }

添加此代码后,我删除了所有迁移并尝试再次生成,但这次它说特权是无效对象。此外,即使我还没有运行该项目并且没有调用 update-database,也会生成一个空数据库。如果我在 Configure() 方法中注释掉 EnsureSeedData,则会生成迁移。

我认为只有在我运行项目时才会调用两行 Database.Migrate() 和 EnsureSeedData() 但似乎在 EnsureSeedData() 中进行了此检查

!context.Privileges.Any()

导致迁移失败。添加迁移真的会在启动中调用 Configure() 吗?它令人困惑,因为我只想创建迁移文件,为什么它运行(或似乎运行) EnsureSeedData()?

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    Startup.Configure() 应该只包含配置请求管道的代码。任何应用启动/初始化代码都应该放在Program.Main()

    【讨论】:

    • 好的,但我的问题是为什么在我运行 add-migration 时会调用它?当您调用 add-migration 命令时,Startup.Configure() 中的所有代码是否都会运行?
    • 如果存在Program.BuildWebHost(),EF Core 工具将调用它来访问应用程序服务提供者。是的,这(不幸的是)将调用Startup.Configure() 作为副作用。解决方法是删除它并使用IDesignTimeDbContextFactory
    • 在新版本中,您甚至可以拥有异步 Main,并像 this 一样实现它。
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2017-11-30
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多