运行DbMigrator.Update的EF代码优先迁移失败

时间:2019-05-21 17:57:20

标签: entity-framework entity-framework-6 ef-migrations

在由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()却未列出任何迁移(空),而已经应用了一些迁移。

您能发现错误吗?

1 个答案:

答案 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
};

非常有趣,我必须自己设置所有字段。在我发现的示例中,人们不需要进行任何设置。