代码优先迁移和使用包管理器控制台命令进行升级一开始可能会有点混乱。
您可以将初始化程序用于CreateDatabaseIfNotExists、DropCreateIfModelChanges、DropCreateDatabaseAlways 和MigrateDatabaseToLatestVersion
见界面IDatabaseInitializer<TContext>.
CreateDatabaseIfNotExists // is the Default initializer.
所以这就是为什么看起来 EF 有时只是为你做事。
所以答案是“是的,你可以“创建一个没有迁移的数据库”
但区别并不明显,如果你愿意长期这样做是另一个问题。
如果您正在使用迁移。它将更新 Db 以匹配代码优先模型。
如果没有数据库,则意味着创建数据库。
所以这就是为什么自动迁移和 CreateDB 看起来令人困惑,因为它们有时会导致相同的结果。但从技术上讲,它们是不同的。
所以通常只使用代码优先自动“迁移”就足够了。
迁移可以是自动的,也可以是“托管的”。
托管迁移方法涉及生成代码、调整代码并运行 PM commandlet 或 POwershell 命令以实际执行迁移。
使用自动迁移,您只需要设置初始化程序并访问 DBContext。
这个过程分为两部分。
a) DB Initializer 步骤。
在实例化 YourDBContext 之前立即执行此操作。
//eg
// DONT TOUCH MY DB or i break your back!
Database.SetInitializer(new ContextInitializerNone<YourDbContext>()); // Do Nothing,
// OR
// yes migrate my db to match my code please.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourDbContext, YourMigrationConfiguration>()); // Set to migration is requested, see config class below
使用迁移初始化器时指定的配置类如下所示
public class YourMigrationConfiguration<TContext> : DbMigrationsConfiguration<TContext>
where TContext : DbContext{
protected YourMigrationConfiguration() {
AutomaticMigrationsEnabled = true; // run it when needed. Do not wait for my PM Command
AutomaticMigrationDataLossAllowed = true; // if the new db look means dropping tables or columns go ahead and kill my data. So use this option with caution.
}
然后在需要时在代码中触发迁移。
Context.Database.Initialize(true); // i place this inside a method on my UoW class
Code first Db initialization strategies.
Code first migrations recommended reading
Managed Migrations
网上有很多关于这个主题的文章。