EF Core迁移是否在add-migration上调用Startup.Configure()

时间:2017-09-01 08:17:03

标签: entity-framework entity-framework-core

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

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,则会生成迁移。

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

!context.Privileges.Any()

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

1 个答案:

答案 0 :(得分:3)

data-min="10" 应该只包含配置请求管道的代码。任何应用启动/初始化代码都应该放在var max = parseInt($('#weight').attr('data-min'));