【发布时间】: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