【问题标题】:Can you create a database without migrations in EF5?您可以在 EF5 中创建没有迁移的数据库吗?
【发布时间】:2013-11-28 00:03:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    代码优先迁移和使用包管理器控制台命令进行升级一开始可能会有点混乱。 您可以将初始化程序用于CreateDatabaseIfNotExistsDropCreateIfModelChangesDropCreateDatabaseAlwaysMigrateDatabaseToLatestVersion
    见界面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

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

    【讨论】:

    • 感谢您的回复。这对我帮助很大。当 AutomaticMigrationEnabled 设置为 true 时有什么区别?如果设置为假怎么办?它有什么不同?
    • 对您的模型进行更改并尝试一下,测试这些功能是让它们感到舒适的最佳方式。添加一个非常快速的搜索会找到stackoverflow.com/questions/11806570/…
    猜你喜欢
    • 2013-04-20
    • 2013-11-28
    • 2013-03-01
    • 2017-03-30
    • 2013-05-20
    • 2013-12-02
    • 2020-04-20
    • 2021-10-27
    • 2020-12-06
    相关资源
    最近更新 更多