问题
In previous version of entity framework, one could recreate the database if the model changes, using some of the classes DropDatabseIfModelChanges and other related classes. In EF7 or EF Core i don't know how to do that. Run the migrations some times give problems and in the beginning of the project i need to change the models constantly.
回答1:
There's currently no easy way to implement DropDatabseIfModelChanges
in EFCore. EF6 worked by storing a snapshot of your model in the __MigrationHistory
table and comparing it to the current model. No such information is stored by EnsureCreated
in EFCore.
To mimic the behavior in EFCore, you could manually store a hash of the model whenever you create the database in EFCore, check the hash on startup, and drop and re-create the database if it has changed.
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();
}
回答2:
Initializers don't exist in EF Core. Instead you can call EnsureCreated (and possibly 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);
}
}
See https://wildermuth.com/2015/03/17/A_Look_at_ASP_NET_5_Part_3_-_EF7
来源:https://stackoverflow.com/questions/39235620/drop-database-if-model-changes-in-ef-core-without-migrations