我目前有一个使用实体框架连接到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以启用自动迁移。'
事实上,我知道我所有的迁移都是最新的代码,因为如果我进入程序包管理器控制台并以这种方式进行添加迁移,它将提供一个空的迁移文件。
答案 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"
};