在不同的TFS分支上工作时丢失EF Code First Migration?

36
我们正在使用TFS,并为我们的Dev创建了不同的分支。
  1. 在A分支中,我们进行了迁移以更改列大小。

  2. 在B分支中,我们进行了迁移以添加新表。 此分支不知道关于A分支所做的修改!!

  3. 两个修改都合并到主分支中。

当我更新数据库时,它会执行这两个迁移,但最后告诉我有未决的更改。 如果我执行Add-Migration,它会创建与第一次迁移(在A分支)相同的内容。

无法将数据库更新为与当前模型匹配,因为存在未处理的更改且禁用了自动迁移。 要么将未处理的模型更改编写为基于代码的迁移,要么启用自动迁移。 将 DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动 迁移。 您可以使用Add-Migration命令将未处理的模型更改编写为 基于代码的迁移。

是因为我的最后一个迁移的IMigrationMetadata属性的Target内容缺失导致它不知道第一个迁移吗?

是否可能在不同的TFS分支中处理迁移?


你是只同步迁移文件,还是也包括数据库?最好只同步模型/类文件,不要同步迁移,并运行Add-Migration为每个开发人员生成特定的“本地”迁移。 - NSGaga-mostly-inactive
迁移1是否在_migrationhistory表中被列为运行? - Betty
3个回答

39

EF迁移步骤包含一个元数据文件,其签名是迁移步骤的模型结果。合并时的问题在于分支B中完成的迁移的签名不包括分支A中完成的迁移内容。只要迁移在各自的分支中,这是正确的。但合并时就会变成错误。

要解决这个问题,您需要使用以下命令重新生成后面迁移的元数据:

add-migration MyMigrationName

如果在现有迁移上运行add-migration而没有使用-force参数,则只会重新生成元数据。

我在我的博客文章EF Migrations and a Merge Conflict中详细介绍了合并场景的步骤。


没有使用“-force”参数将只会重新生成元数据,而在我的情况下,它会生成一个名称中添加了“1”的迁移文件 :( - tymtam
@Tymski 这是假设已经应用了现有的迁移。首先运行 update-database -targetmigration <Previousmigration> 进行更新。 - Anders Abel

1
作为对Anders Abel答案的补充,针对那些在尝试重新生成最后一次迁移元数据时出现问题的人,导致EF创建一个带有1附加的单独迁移。

您必须包含完整的日期/时间戳。

例如:

如果您之前的迁移文件名为201701011322_MakeChangesToPotatoTable

那么您必须在"Add-Migration"命令中正确地包含全名。

即:

Add-Migration 201701011322_MakeChangesToPotatoTable

0

使用EF Core,模型的当前状态保存在***ModelSnapshot.cs中。通常会进行合并,因此您无需做任何事情...除非存在冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接