您可以在EF5中创建没有迁移的数据库吗?

时间:2013-11-28 00:03:51

标签: asp.net asp.net-mvc entity-framework

我正在关注官方的asp.net“使用MVC 4开始使用EF 5”。在该教程中,数据库是在执行迁移时创建的(根据我的理解)。当我使用Mvc 5教程查看EF 5时,他们没有使用迁移来创建数据库。他们使用数据库初始化器。所以,我想知道可以为您的项目创建一个数据库而不使用EF 5中的迁移吗?此外,这两种方法的区别是什么?

1 个答案:

答案 0 :(得分:6)

代码优先迁移和使用程序包管理器控制台命令进行升级最初会让人感到有些困惑。 您可以将初始值设定项用于CreateDatabaseIfNotExistsDropCreateIfModelChangesDropCreateDatabaseAlwaysMigrateDatabaseToLatestVersion
请参阅界面IDatabaseInitializer<TContext>.

CreateDatabaseIfNotExists   // is the Default initializer.

所以这就是为什么EF有时会为你做的事情。

所以答案是“是的,你可以”创建没有迁移的数据库“

但差异并不明显,如果你愿意长期这是另一个问题。 如果您正在使用迁移。它将更新Db以匹配代码第一个模型。 如果没有数据库,则表示创建数据库。 因此,为什么自动迁移和CreateDB看起来令人困惑,因为它们有时会导致相同的结果。但从技术上讲,它们是不同的。

所以通常只使用代码第一次自动“迁移”就足够了。

迁移可以是自动迁移,也可以是“托管”。 托管迁移方法会调用生成代码,调整代码并运行PM命令行开关或POwershell命令来实际执行迁移。

使用自动迁移,您只需设置intitializer并访问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

使用Migration初始化程序时指定的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

Code first Db initialization strategies.
Code first migrations recommended reading
Managed Migrations

网上有很多关于这个主题的文章。