即使禁用了自动迁移,Update-Database也会尝试执行自动迁移

时间:2012-09-09 17:53:59

标签: entity-framework ef-migrations

我在使用EF5的4名开发人员的团队中工作,每个人都在自己的本地数据库上工作。到目前为止,我们一直在使用自动迁移,但我们已接近需要发布到生产的位置,因此我们已禁用自动迁移并开始添加基于代码的显式迁移。

问题出现了:在开发人员创建新的显式迁移后我运行了Update-Database命令,我收到以下错误:

Applying code-based migrations: [201209080142319_CreatedDate.LastModifiedDate.Additions].
Applying code-based migration: 201209080142319_CreatedDate.LastModifiedDate.Additions.
Applying automatic migration:    201209080142319_CreatedDate.LastModifiedDate.Additions_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.

即使我禁用了自动迁移,为什么会出现此错误?我可以通过删除显式迁移然后重新构建它来运行Add-Migration来修复此错误。然后Update-Database运行正常并且没有提到任何关于'自动迁移...'的信息。此外,我运行Add-Migration时创建的迁移中的代码与我的队友创建的代码相同。我不明白为什么它会尝试自AutomaticMigrationsEnabled = false;以来进行自动迁移。

我在这里缺少什么?

5 个答案:

答案 0 :(得分:25)

我不想回答我自己的问题,但我又遇到了这个问题。我的团队中的开发人员在其本地计算机上重新启用了自动迁移,然后创建了一个显式迁移,一旦我运行它就会重现此行为。

实体框架始终运行自动迁移,然后运行显式迁移,其Source文件中定义了.resx属性,即使 strong> AutomaticMigrationsEnabled = false。如果在运行自动迁移后创建了Source属性,则显式迁移将仅设置{{1}}属性。

结果是,禁用自动迁移仅意味着EF在检测到模型更改时不会自动升级您的架构 - 但如果需要填补某些显式迁移之间的间隙,它仍可能会执行自动迁移。要避免此行为,请不要混合使用自动迁移和显式迁移。

答案 1 :(得分:3)

public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }

添加AutomaticMigrationDataLossAllowed = true;,因此您假设您希望允许EF添加导致数据丢失的删除SQL对象。

答案 2 :(得分:0)

AutomaticMigrationEnabled = false会阻止您的应用程序自行更新数据库。

但是,由于您自己运行Update-database,Update-Database会检查数据库的当前状态,然后运行数据库中尚未包含的所有迁移步骤,包括没有代码的模型(dbContext)中的更改 - 基于迁移。

我的猜测是,模型会发生变化,导致数据丢失。

您可以使用-force参数在数据丢失时应用更改。

答案 3 :(得分:0)

我的团队经历过可能与此相关的事情。如果两个团队成员都添加了迁移,检查他们的代码,获取最新信息,然后执行update-database,则第二个团队会收到错误,因为迁移“已跳过” - 他们的系统看到团队成员的迁移从未实现过

我们已经开始检查所有内容并获取最新信息,执行更新数据库(如果团队成员添加了新迁移),然后执行add-migration,update-database,check-in。

答案 4 :(得分:0)

@Dave Graves是正确的。我遇到了同样的问题,并做了修复,以禁用特定迁移文件的自动迁移

这里有一些说明:

  1. 转到解决方案资源管理器中迁移文件的位置(如果使用的是Visual Studio)
  2. 寻找导致自动迁移的迁移文件,例如:202008181102535_BlogPost.cs
  3. 展开它,您将看到它的设计器文件。打开该文件
  4. 在该文件内,您将看到它的Source属性是由Resources.GetString("Source")之类的东西设置的。将其替换为null,然后再次尝试在包管理器控制台中手动执行update-database