如果EF Core中的模型更改而没有迁移,则删除数据库

时间:2016-08-30 19:28:04

标签: c# entity-framework asp.net-core entity-framework-core ef-migrations

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

2 个答案:

答案 0 :(得分:4)

目前还没有简单的方法在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();
}

答案 1 :(得分:1)

初始化程序不存在于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