我遵循官方的asp.net“使用MVC 4开始使用EF 5”。在本教程中,数据库是在执行迁移时创建的(据我理解)。当我使用Mvc 5教程查看EF 5时,他们没有使用迁移来创建数据库。他们使用数据库初始化器。所以,我想知道是否可以在不使用EF 5迁移的情况下为您的项目创建一个数据库?而且,这两种方法有什么区别呢?
发布于 2013-11-28 00:47:37
代码第一迁移和使用Package控制台命令进行升级一开始可能会有些混乱。您可以将初始化器用于CreateDatabaseIfNotExists、DropCreateIfModelChanges、DropCreateDatabaseAlways和MigrateDatabaseToLatestVersion。
参见接口IDatabaseInitializer<TContext>.
CreateDatabaseIfNotExists // is the Default initializer.所以这就是为什么EF有时会为你做一些事情。
所以答案是“是你可以”创建一个没有迁移的数据库“
但两者之间的差别并不明显,如果你愿意这么做的话,那么长期来看则是另一个问题。如果您正在使用迁移。它将更新Db以匹配代码优先模型。如果没有数据库,那就意味着创建数据库。所以这就是为什么自动迁移和CreateDB看起来很混乱,因为它们有时会导致相同的结果。但从技术上讲,它们是不同的。
因此,通常只使用代码第一次自动“迁移”就足够了。
迁移可以是自动的,也可以是“管理的”。托管迁移方法调用生成代码,调整代码并运行PM命令或POwershell命令来实际执行迁移。
使用自动迁移,您只需要设置初始化程序并访问DBContext。
这个过程有两个部分。
( a) DB启动程序步骤。在实例化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在使用迁移初始化器时指定的Confirguration类如下所示
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代码优先的Db初始化策略。
代码第一迁移推荐阅读
管理迁移
网上有很多关于这个话题的文章。
https://stackoverflow.com/questions/20255489
复制相似问题