19

我在一个使用 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;.

我在这里想念什么?

4

5 回答 5

32

我讨厌回答自己的问题,但我又遇到了这个问题。我团队中的一位开发人员在他们的本地机器上重新启用了自动迁移,然后创建了一个显式迁移,它在我运行它后立即重现了这种行为。

实体框架将始终在运行具有在其文件中Source定义的属性的显式迁移之前运行自动迁移,即使. 如果显式迁移是在运行自动迁移后创建的,那么它只会设置属性。.resx AutomaticMigrationsEnabled = falseSource

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

于 2013-06-05T16:57:34.547 回答
2
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }

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

于 2013-04-23T23:33:48.107 回答
0

我的团队经历了一些可能与此有关的事情。如果两个团队成员都添加了一个迁移,签入他们的代码,获取最新的,然后执行更新数据库,第二个将得到一个错误,因为有一个迁移“跳过” - 他们的系统看到团队成员的迁移从未实现.

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

于 2012-09-10T21:00:26.380 回答
0

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

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

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

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

于 2012-09-10T00:59:01.427 回答
0

@Dave Graves 是对的。我有同样的问题并做了他的修复以禁用特定迁移文件的自动迁移

继承人一些说明:

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