在由EF Code首先使用EF迁移支持的ASP.NET MVC Web应用程序中,我需要更好地控制数据库更新,使其成为半自动的。目标是仅从代码中运行它们(例如,通过运行DbMigrator.Update()
),但如果未运行,则应用程序仍应执行,而忽略可能的更改。
为此,我将DbMigrationsConfiguration.AutomaticMigrationsEnabled
设置为false
,但是在第一次访问数据库时,遇到了以下异常:
System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException :'由于存在未决的更改并且自动迁移被禁用,因此无法更新数据库以匹配当前模型。将待处理的模型更改写到基于代码的迁移中,或者启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。'
好的一面:我可以通过将disableDatabaseInitialization="true"
中的Web.config
设置为described at MSDN来忽略异常(我找不到其他工作方式)。
我正在自定义触发器上运行以下代码:
var config = new DbMigrationsConfiguration<MyContext>
{
AutomaticMigrationsEnabled = false,
AutomaticMigrationDataLossAllowed = false,
MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
MigrationsNamespace = typeof(InitialCreate).Namespace
};
var migrator = new DbMigrator(config);
migrator.Update(); // throws Exception
Update调用引发:
System.Data.SqlClient.SqlException :“数据库中已经存在一个名为“ MyEntity”的对象。”
这可能与disableDatabaseInitialization
的使用有关。同样,对migrator.GetLocalMigrations()
的调用列出了所有迁移,但migrator.GetDatabaseMigrations()
却未列出任何迁移(空),而已经应用了一些迁移。
您能发现错误吗?
答案 0 :(得分:0)
经过大量尝试,我能够发现自己,缺少的ContextKey
属性引起了问题:
var config = new DbMigrationsConfiguration<MyContext>
{
AutomaticMigrationsEnabled = false,
AutomaticMigrationDataLossAllowed = false,
MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
MigrationsNamespace = typeof(InitialCreate).Namespace,
ContextKey = nameof(MyContext) // Fixed the issue
};
非常有趣,我必须自己设置所有字段。在我发现的示例中,人们不需要进行任何设置。