首先是MVC3代码:迁移和生成数据库

时间:2012-07-07 10:02:15

标签: asp.net-mvc-3 entity-framework code-first dbmigrator

我有点失去了如何让实体框架与自动迁移一起工作。我想要:

  • 当数据库不存在时自动创建
  • 模型更改时自动更新的数据库

对于后者,我正在使用DbMigrator。它相当慢,所以我不想每次请求都运行它,而且我在同一个应用程序中有多个数据库,所以它不能进入​​Application_Start,这就是我把它放在Session_Start中的原因:

    if (Session["started"] == null)
    {
        // this takes care of any database updates that might be necessary. 
        MigrationConfiguration configuration = new MigrationConfiguration();
        DbMigrator migrator = new DbMigrator(configuration);
        List<string> pm = migrator.GetPendingMigrations().ToList();
        if (pm.Count > 0)
        {
            migrator.Update();
        }
    }
    else
    {
        Session["started"] = "started";
    }

不确定这是否是正确的方法但它似乎有效,但是当它不存在时它实际上并没有生成数据库。它给了我一个“无法打开数据库”db“登录请求”

我之前有以下工作:

    Database.SetInitializer<DbContext>(new InitializerIfModelChange());

这会丢弃数据库并生成种子数据,这对于数据库不存在时很好但在数据库更改时也是触发器(在这种情况下我希望DbMigrator能够处理它)这是在Application_Start之前,但我'我不知道该怎么做。我担心它会与DbMigrator发生冲突。为了实现前面描述的两件事,我如何设置这一切?

1 个答案:

答案 0 :(得分:1)

每当需要更改数据库时,我都会在包管理器中手动运行Update-Database。最初我像你一样使用Database.SetInitializer来创建数据库,但现在已将其注释掉了。

结帐Entity Framework 4.3 Automatic Migrations Walkthrough获取更多高级帮助。

这应该适用于你想要的东西,然后如果你需要创建一个新的数据库,只需像你一样添加Database.SetInitializer<NewDBContext>(new NewDBInitializer());,构建并运行。然后将其注释掉,以便将来不会在模型更改中运行,而是在包管理器中使用Update-Database命令。