EF - Code First - 自动更新数据库

3

我想在我的代码中使用自动迁移,但是每次更改模型后,都需要手动运行update-Database。我可以自动化吗?

以下是配置:

public class Configuration : DbMigrationsConfiguration<ManualContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    ...
}

还有 AppActivator

[assembly: WebActivator.PreApplicationStartMethod(typeof(AppActivator), "PreStart")]
[assembly: PostApplicationStartMethod(typeof(AppActivator), "PostStart")]
[assembly: ApplicationShutdownMethod(typeof(AppActivator), "Stop")]

namespace Manual.Web
{
  public static class AppActivator
  {
    public static void PreStart()
    {
      Database.SetInitializer(
               new MigrateDatabaseToLatestVersion<ManualContext,Configuration>());
      Database.SetInitializer(new ManualDbInitializer());

      MeasurementConfig.RegisterUnits();
      MiniProfilerPreStart();
    }
    ...
  }

而 ManualDbInitializer 则用于种子数据(当第一次创建数据库时):

public class ManualDbInitializer : CreateDatabaseIfNotExists<ManualContext>
{
    protected override void Seed(ManualContext context)
    {
        ManualDbInitializerSeed.SeedForDB(context);
    }
}
1个回答

0
如果您正在部署应用程序,可能希望在应用程序启动时自动升级数据库(通过应用任何待处理的迁移)。您可以通过注册MigrateDatabaseToLatestVersion数据库初始化程序来实现此目的。数据库初始化程序只是包含一些逻辑,用于确保正确设置数据库。此逻辑在应用程序进程(AppDomain)中首次使用上下文时运行。

http://msdn.microsoft.com/en-us/data/jj591621#initializer


@TamarG: ManualDbInitializer()是什么?您在MigrateDatabaseToLatestVersion<ManualContext, Configuration>()后设置它。 - Masoud
1
@TamarG:实际上你的ManualDbInitializerCreateDatabaseIfNotExists,所以你正在将Database初始化器设置为CreateDatabaseIfNotExists而不是MigrateDatabaseToLatestVersion。将你的Seed()方法移动到你的Configuration类中。 - Masoud
如果我将Seed()移动到Configuration中,它仅在创建新的数据库时调用还是每次更新数据库时都会调用? - TamarG
@TamarG:我自己没有检查过,但在https://dev59.com/lWYr5IYBdhLWcg3wpbuQ#14157184中,Jon Smith说:“微软的注释说'此方法将在迁移到最新版本后调用。'然而我的测试表明它每次启动软件时都会被调用”。 - Masoud
谢谢。我移除了 "Database.SetInitializer(new ManualDbInitializer());" 并且在我的 seed() 中检查了我的上下文是否为空,只有在这种情况下才填充它。非常感谢! - TamarG
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接