实体框架-从ASP.NET Web应用程序中的代码迁移数据库

时间:2018-11-30 18:01:01

标签: c# asp.net entity-framework entity-framework-6

我目前有一个使用实体框架连接到SQL Server数据库的ASP.NET Web应用程序。 EF迁移位于同一解决方案的单独项目中。应用程序启动后,我想使用现有迁移(AutomaticMigrationsEnabled == false)自动更新到最新版本。

我的WebApiConfig.cs文件中包含以下代码:

var database = new ApplicationDbContext().Database;

var configuration = new DbMigrationsConfiguration
        {
            TargetDatabase = new DbConnectionInfo(database.Connection.ConnectionString, "System.Data.SqlClient"),
            ContextType = typeof(ApplicationDbContext),
            MigrationsAssembly = Assembly.GetAssembly(typeof(ApplicationDbContext)),
            MigrationsNamespace = typeof(ApplicationDbContext).Namespace,
        };

var migrator = new DbMigrator(configuration);
migrator.Update();

但是,运行此命令时,出现以下错误:

  

System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException:'由于存在挂起的更改并且自动迁移被禁用,因此无法更新数据库以匹配当前模型。将待处理的模型更改写到基于代码的迁移中,或者启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。'

事实上,我知道我所有的迁移都是最新的代码,因为如果我进入程序包管理器控制台并以这种方式进行添加迁移,它将提供一个空的迁移文件。

1 个答案:

答案 0 :(得分:0)

我知道了。 MigrationsNamespace与ApplicationDbContext的命名空间不同。我必须明确地将命名空间放在所有迁移文件所在的位置。另外,在实例化配置时,我必须包括适当的上下文密钥。现在可以正常工作,看起来像这样:

var database = new ApplicationDbContext().Database;
        var configuration = new DbMigrationsConfiguration
        {
            TargetDatabase =
                                        new DbConnectionInfo(
                                            database.Connection.ConnectionString,
                                            "System.Data.SqlClient"),
            ContextType = typeof(ApplicationDbContext),
            MigrationsAssembly = Assembly.GetAssembly(typeof(ApplicationDbContext)),
            MigrationsNamespace = "Prom.Database.Migrations",
            ContextKey = "Prom.Database.Migrations.Configuration"
        };