协作环境中实体框架的迁移

2024-02-28

我们有多个开发人员正在开发一个使用 Entity Framework 5.0 的项目。每个开发人员都使用自己的本地 SQL 2012 数据库,这样他就可以在不妨碍其他人的情况下进行开发和测试。

起初,我们混合使用自动迁移和基于代码的迁移。这根本不起作用,因此我们决定禁用自动迁移并只允许基于代码的迁移。我应该补充一点,我们从一个干净的数据库重新开始,没有“损坏”_MigrationsHistory来自所有自动迁移。

所以现在的工作流程是:

  1. 开发人员更改他的数据模型
  2. Does add-migration <Name>并将其应用到他的数据库中update-database.
  3. 签入数据模型更改以及迁移到 Git 中。
  4. 另一位开发人员拉取、接收更改并将其应用到他的数据库中。

到目前为止,这效果很好。然而,在今天之前,通常只有我进行迁移,其他人应用它们。但今天有来自三个开发人员的迁移。我刚刚取消了这些迁移,做了一个update-database一切顺利。

我也对我自己的数据模型进行了更改,但是在最后update-database它给了我一个警告,我仍然没有更新,所以我做了add-migration <my migration>。然而,当它构建迁移时,它给了我已经应用于数据库的所有迁移的更改。所以:它尝试删除已经删除的列,尝试创建一个已经存在的表,等等。

怎么可能?我的假设是 EF 只会检查_MigrationsHistory表并找出表中尚不存在的迁移,并按名称中的时间戳顺序一一应用这些迁移。但显然不是,因为即使当我撤消自己的更改并且我有一个干净的环境时,它仍然抱怨我的数据库与模型不同步。但我只是提取了这些更改并将它们应用到我的数据库中。它is同步中。我可以看到我刚刚应用的迁移_MigrationsHistory表也​​。

我唯一能想到的是,我向数据模型添加了一个不会导致数据库更改的属性(我添加了一个List<X>到数据模型 Y,其中 X 是一对多关系中的多个。这不会导致数据库更改,因为 X 已经有 Y 的外键)。会是这样吗?如果是这样,那真的很脆弱,因为没有办法为此添加迁移,因为没有数据库更改,而且我也不知道如何解决这个问题。

我不知道如何处理这个问题,因为我当然可以编辑它所搭建的内容并删除已经应用于我的数据库的所有内容。但然后呢?我签入它,然后其他一些开发人员收到相同的消息,即使在应用我的新更改后,他的数据库也不是最新的,搭建他自己的更改,获得相同的废话脚手架,编辑它,签入它,然后next开发人员明白了。它变成了一个恶性循环,与我们使用自动迁移时的情况类似,我认为我们已经通过切换到仅基于代码来解决了这个问题。我现在不能相信它会做正确的事情,与这样的人一起工作是一场噩梦。

我还尝试过添加我从同事那里一一提取的迁移update-database -t:201211091112102_<migrationname>但无济于事。它仍然给我错误的脚手架。

那么我们在这里做错了什么,或者 EF 根本就不是为这样的协作而构建的?

UPDATE

我创建了一个可重现的测试用例,但为了模拟这个多用户/多数据库场景,这有点漫长。

https://github.com/JulianR/EfMigrationsTest/ https://github.com/JulianR/EfMigrationsTest/

当您拥有上述项目时重现的步骤(这些步骤也存在于代码中):

  1. 添加迁移初始化
  2. 更新数据库(在数据库“TestDb”上)
  3. 更改连接字符串以指向 TestDb1
  4. TestDb1 上的更新数据库
  5. 取消类 Test 上的属性 Foo 的注释
  6. add-migration M1 将属性 Foo 添加到 TestDb1
  7. 再次注释掉Test.Foo
  8. 更改连接字符串以指向 TestDb2
  9. 从项目中排除迁移 M1,以便它不会应用于 TestDb2
  10. 取消注释类 Test 上的属性 Bar
  11. 更新数据库以将 Init 迁移应用到 TestDb2
  12. add-migration M2 将属性 Bar 添加到 TestDb2
  13. 更改连接字符串以再次指向原始 TestDb
  14. 再次将迁移M1包含到项目中
  15. 取消类 Test 上的属性 Foo 的注释
  16. 取消注释类 Test 上的属性 SomeInt
  17. 更新数据库
  18. 添加迁移 M3
  19. update-database,收到错误,因为 M3 尝试将列 Foo 添加到数据库 TestDb,该数据库刚刚由迁移 M1 添加。

上面是模拟三个用户,其中用户1初始化他的数据库,另外两个用户也使用他的初始化来创建他们的数据库。然后,用户 2 和用户 3 都对数据模型进行自己的更改,并将其与应用更改所需的迁移一起添加到源代码管理中。然后用户 1 拉取用户 2 和 3 的更改,同时用户 1 自己也对数据库进行了更改。然后用户1调用update-database应用用户 2 和 3 的更改。然后,他搭建自己的迁移,然后错误地将用户 2 或 3 的更改添加到搭建的迁移中,这在应用于用户 1 的数据库时会导致错误。


您需要添加一个空白的“合并”迁移,该迁移将重置 .resx 文件中最新迁移的快照。使用 IgnoreChanges 开关执行此操作:

Add-Migration <migration name> -IgnoreChanges

See here http://msdn.microsoft.com/en-us/data/dn481501解释一下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协作环境中实体框架的迁移 的相关文章

  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • 从脚本内更改自动热键托盘图标

    如何从 Autohotkey 脚本中将托盘图标更改为 my ico 例如 当脚本暂停时 为此 我在托盘菜单中提出了自己的 暂停脚本 菜单项 SingleInstance ignore Menu Tray Tip AutoCase 0 11
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 文本溢出:省略号显示不同的字符

    我这里遇到了一些 CSS 问题 看这张图片 https www flickr com photos 125543025 N07 saved 1 在此图像中 我为文本 INTENSE TRAINING 添加了 CSS 样式 sample st
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code
  • 如何在 kubernetes 中将秘密标记为可选?

    来自文档 除非将秘密标记为可选 否则必须先创建秘密 然后再将其作为环境变量在 pod 中使用 引用不存在的 Secret 将阻止 pod 启动 如何将秘密标记为可选 您正在寻找的是 name ENV NAME valueFrom secre
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • 自定义字符串查询操作的 Linq to NHibernate 可扩展性?

    我希望能够在 NHibernate Linq 表达式中使用自定义字符串查询 举例来说 这只是一个例子 我希望能够选择包含属性的实体 该属性是特定字符串的字谜 var myEntities EntityRepository AllEntiti
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • 如何丢弃在睡眠功能期间传递的用户输入?

    我正在尝试使用终端创建游戏 我询问玩家是否准备好 然后使用下面的代码进行倒计时 问题在于用户所做的所有输入都会添加到程序所做的下一个输入查询中 我正在寻找一种方法来丢弃以前的输入或在此函数期间完全阻止它 我可以做一个 getchar 循环
  • 使用 python 连接字节列表

    我正在尝试开发一个工具来读取二进制文件 进行一些更改并保存它 我想做的是列出文件中的每一行 处理几行 然后再次加入该列表 这是我尝试过的 file open myFile exe r b aList for line in f aList
  • php mysqli 准备语句选择

    尝试让一个函数能够为任何表创建带有多个参数的简单 CRUD 选择 我认为我已经完成了最难的部分 但现在无法获取数据 也许我做错了什么我无法弄清楚 我准备好的语句函数 function prepared query mysqli sql pa
  • emacs 不备份 git repo 中的文件

    emacs不创建文件内的备份git存储库 我希望保存它们 因为我经常依靠它们在将更改提交到git repo 我正在使用xemacs直到最近 它总是会创建通常的 第一次保存时的文件 但emacs如果在 a 内工作则不会执行此操作git项目 在
  • 从 jenkins 运行 selenium testNG 时,chrome 不会最大化

    我在跑步时遇到问题 硒测试NG 来自 jenkins 的测试 问题是我正在登录我的应用程序并检查一些元素可见性 当我直接从批处理文件运行测试时 我取得了成功 因为我将我的 google chrome 驱动程序设置为最大化使用 driver
  • 如何使用整理器按属性排序? (爪哇)

    我使用Java 我想使用 Collat or 按属性对对象的子列表进行排序 以便按字母顺序排序但忽略重音符号 问题是我尝试了不同的方法 但没有任何效果 这会对子列表进行排序 但不会忽略重音符号 newList subList 0 5 sor
  • Mapfile 作为 MapReduce 作业的输入

    我最近开始使用 Hadoop 在使用 Mapfile 作为 MapReduce 作业的输入时遇到问题 以下工作代码在 hdfs 中编写一个名为 TestMap 的简单 MapFile 其中包含三个 Text 类型的键和三个 BytesWri
  • Gradle 5 和 IntelliJ 2018.3。无法识别的选项:--add-opens 或 java.base.java.lang=ALL-UNNAMED

    我有一组由 Gradle 4 10 3 构建的复杂项目 我可以从命令行构建它们 但也可以将它们导入 IntelliJ 2018 3 Ultimate 不会出现重大问题 当我将 Gradle 升级到 5 1 1 时 项目仍然可以从控制台正常构
  • Perl Windows IPv6

    我有一个使用 TCP IP 套接字的 Perl Windows 应用程序 我需要添加 IPv6 支持 我有一台 Windows 7 64 位计算机 它运行带有 Hurricane Electric 隧道的 IPv6 它的得分为 10 分 满
  • 如何在 Github 中为 Makefile 保留选项卡

    Github 自动将制表符转换为多个空格 所以 每次我创建一个Makefile在 Github 中 我需要在我的 Linux 盒子中克隆存储库并编辑Makefile using vim进而push将更改返回到我的 Github 存储库以避免
  • 具有透明背景的 JavaFX 按钮

    我有一些经典Button在 JavaFX 中 带有一个包含一些文本的框 我需要没有那个框的按钮 只需要文本 当我悬停按钮或用鼠标单击按钮时 它会将其颜色更改为不同的颜色 在 JavaFX 中 样式是通过使用 CSS 来完成的 button
  • 使用 D3.js 在曲线类型之间转换

    我想使用 D3 js 在曲线类型之间进行转换 看一眼这个街区 https bl ocks org iaindillingham 67835c954c5e3a1fd00eed35a0b37765 数据保持不变 但曲线类型发生变化 我原以为路径
  • 将 Json 转换为 Poco 集合/如何编写 For Each?

    我对 Azure Functions 还很陌生 我创建了一个 C WebHook Azure 函数 我想这是正确的事情 来获取我的 json 内容并将其转换为简单的 poco dto 对象的集合 public static class Ge
  • 我的应用程序未显示在 Google Play 中 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我大约 18 小时前将我的应用程序上传到 google play 但它没有显示 开发者控制台显示 已发布 我想应该可以在 url
  • 使用ffmpeg处理rtsp流url时出现未知命令失败

    我想使用ffmpeg从rtsp流中抓取图像 命令如下 ffmpeg y i rtsp zigong stream xl02 cn 557 HongTranSvr DevId 1b038d27 858c 46a1 b803 a2984af34
  • 关闭 I/O 流

    如果我不关闭流 可能会发生哪些不好的事情 关闭操作会自动刷新吗 程序退出后所有的流都关闭了吗 提前致谢 如果您不关闭流 可能会发生不好的事情 你可能会用完文件句柄 您认为写入磁盘的数据可能仍在缓冲区中 仅 文件可能仍被其他进程锁定 取决于平
  • 将 .jar 文件添加到 git 存储库中

    我在 eclipse 上有一个项目 最近我创建了一个名为 lib 的新文件夹 并在其中添加了一些 jar 文件 我似乎无法将更改提交到 git 它只是没有出现在文件跟踪列表中 我已经从我的分支中的 gitignore 中删除了 jar 并提
  • 温莎城堡中的多个装饰器模式

    我们正在重新设计一些遗留软件以使其更具可测试性 并决定使用依赖注入和 Castle Windsor 来帮助我们 首先 我们的目标 许多装饰器都在数据流上工作 装饰器的多种组合是可能的 并且每种情况下的根节点可能需要从不同的地方获取数据 从技
  • ExpressJS:将参数传递给html不起作用

    这是我的server js var browserify require browserify middleware var express require express var app express var path require
  • 协作环境中实体框架的迁移

    我们有多个开发人员正在开发一个使用 Entity Framework 5 0 的项目 每个开发人员都使用自己的本地 SQL 2012 数据库 这样他就可以在不妨碍其他人的情况下进行开发和测试 起初 我们混合使用自动迁移和基于代码的迁移 这根