0

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

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

对于后者,我使用的是 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 冲突。为了实现前面描述的两件事,我将如何设置这一切?

4

1 回答 1

1

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

Checkout Entity Framework 4.3 自动迁移演练以获得更高级的帮助。

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

于 2012-07-07T10:12:41.950 回答