如果模型在EF Core中更改而不进行迁移,则删除数据库



在以前版本的实体框架中,如果模型更改,可以使用DropDatabseIfModelChanges类和其他相关类重新创建数据库。在EF7或EF Core中我不知道如何做到这一点。运行迁移有时会出现问题,并且在项目开始时我需要不断更改模型。

目前没有简单的方法在EFCore中实现DropDatabseIfModelChanges。EF6通过在__MigrationHistory表中存储模型的快照并将其与当前模型进行比较来工作。EnsureCreated在EFCore中没有存储这些信息。

为了模仿EFCore中的行为,您可以在EFCore中创建数据库时手动存储模型的哈希值,在启动时检查哈希值,如果数据库发生更改,则删除并重新创建数据库。

var currentHash = MyHashingFunction(db.Model);
if (db.GetService<IRelationalDatabaseCreator>().Exists()
    && !db.Set<ModelHash>().Any(mh => mh.Value == currentHash))
{
    // Drop if changed
    db.Database.EnsureDeleted();
}
if (db.Database.EnsureCreated())
{
    // Insert hash if created
    db.Add(new ModelHash { Value = currentHash });
    db.SaveChanges();
}

EF Core中不存在初始化式。相反,你可以调用EnsureCreated(也可能是EnsureDeleted):

public class MyCountriesContext : IdentityDbContext<ApplicationUser>
{
  public MyCountriesContext()
  {
    Database.EnsureCreated();
  }
  public DbSet<Visit> Visits { get; set; }
  protected override void OnModelCreating(ModelBuilder builder)
  {
    builder.Entity<Visit>().Key(v => v.Id);
    base.OnModelCreating(builder);
  }
}

见https://wildermuth.com/2015/03/17/A_Look_at_ASP_NET_5_Part_3_-_EF7

最新更新