Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git EntityFramework迁移无法更新数据库,支持冗余迁移_Git_Entity Framework - Fatal编程技术网

Git EntityFramework迁移无法更新数据库,支持冗余迁移

Git EntityFramework迁移无法更新数据库,支持冗余迁移,git,entity-framework,Git,Entity Framework,偶尔,在git分支之间切换,然后尝试运行解决方案(通过针对该分支的进度进行适当的迁移来更新数据库之后),我会收到一个数据库错误 无法更新数据库以匹配当前模型,因为存在挂起的更改,并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMiggrationsEnabled设置为true以启用自动迁移 需要注意的是,该过程需要手动迁移 无论如何,通过添加迁移来添加迁移会构建一个迁移,该迁移在上一次迁移中已经执行或创

偶尔,在git分支之间切换,然后尝试运行解决方案(通过针对该分支的进度进行适当的迁移来更新数据库之后),我会收到一个数据库错误

无法更新数据库以匹配当前模型,因为存在挂起的更改,并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMiggrationsEnabled设置为true以启用自动迁移

需要注意的是,该过程需要手动迁移

无论如何,通过添加迁移来添加迁移会构建一个迁移,该迁移在上一次迁移中已经执行或创建了操作/内容,而在下一次迁移中没有一个操作/内容被删除(我多次检查数据库以确认)。在尝试将数据库更新到该迁移时,控制台会给出一个错误:

每个表中的列名必须是唯一的

这将确认尝试构建的内容已经是数据库的一部分

清空上下浮动并对其进行更新作为一种变通方法是相当有用的。如果在执行此操作后立即添加另一个迁移,则该迁移将为空,这表示没有任何内容可供移植

通常情况下,我可以更新针对最后一次真正迁移的数据库,并删除空的数据库,这样可以正常工作一段时间。但如果我用git做任何事情,它都会被撤销。该解决方案是可以接受的,但耗时且烦人。我想知道是否有办法阻止这种情况发生


编辑:我忘了提到,在我开始项目并返回之前,我一直在尝试向下迁移。这没用。此外,脚手架几乎总是一行一行地复制另一个迁移行(至少最近是这样)。

了解EF如何生成和执行迁移可能有助于您解决问题

EF使用二进制模型快照来确定要包含在支架式迁移中的增量更改。快照作为代码的一部分存储,作为扩展名为
.resx
且与迁移代码类同名的嵌入式资源文件。此外,执行
updatedatabase
时,快照存储在当前本地数据库中。每次运行迁移时,都会在表
\u MigrationsHistory
中插入一条记录,快照存储在
Model
列中

请注意,快照不是从数据库实际模式生成的,而是从模型类中的代码生成的。创建新迁移时,EF会动态生成当前模型类的快照,并将其与上一次迁移的快照进行比较(同样,不是与实际的数据库架构进行比较)

当您切换代码分支时,您的代码会被修改,但您的本地数据库不会被修改,而且您从Git获得的代码可能会与数据库中的快照和
\uu MigrationsHistory.Model
的内容不同步

然而,即使知道所有这些,您的问题也不容易解释,假设您恢复到以前的通用迁移。也许您在框架式迁移中添加了一些手动更改,或者您确实添加了一些
Up
代码,但没有正确的
Down
代码。或者您的分支中有不同的模型代码,但生成的迁移具有相同的名称。或者使用相同名称但时间戳不同的迁移,因此它们会在
\u MigrationsHistory
表中重复。无论如何,一旦数据库与代码迁移不同步,就很难将其恢复同步。通常,您只需删除它,然后从头开始创建它

一些可能有帮助的建议:

  • 在生成新迁移之前,请检查
    \u MigrationsHistory
    表的内容。确保
    MigrationId
    列中最后一条记录中的值与上次代码迁移的名称、时间戳编号和所有值匹配。如果没有,请尝试使用
    -SourceMigration
    -TargetMigration
    参数运行
    更新数据库
    ,以将数据库降级到模型的正确版本

  • 如果要更改代码分支,并且要通过使用较旧的目标迁移运行
    updatedatabase
    来降级数据库,请在获取新分支的代码之前执行此操作。您可以使用旧代码降级,然后使用新代码升级。以这种方式降级会从
    \uu MigrationsHistory
    中删除受影响的记录,因此,一旦获得新的分支代码,就不会保留旧型号代码中的任何内容

  • 您还可以手动删除
    \u MigrationsHistory
    中的记录,以避免再次应用迁移。但是要小心,因为数据库的实际模式将保持不变


更详细地说。

我不明白……现在……你的主要问题是EF(以及你说的以下错误,但它是???)或git?我正在处理它,好像实体框架是最有可能导致问题的原因,但考虑到切换分支时会出现问题,它可能与git有关。