在this question中,我遇到了一个问题,即我正在为已部署的应用程序编写更新,以使数据库与我们正在部署的较新版本保持同步。基本概要如下:
- 开始使用当前部署的应用程序版本
- 添加了使用现有数据库的新功能
- 添加了新的数据库表和关系
- 添加了依赖于新数据库结构的新功能
- 测试完成,可随时部署
这里的问题是,当前部署的应用程序已经使用了几个月,并且需要保留大量数据,因此简单地用新旧应用程序取代旧应用程序是不可行的(至少不适用于数据库,但当然它适用于代码)。因此,我使用以下步骤在SQL中编写脚本,以便在第一次启动时运行应用程序的更新版本,以便在不触及现有数据的情况下对数据库进行必要的更改(除了填充新表):
- 使用VS2010的“从模型生成数据库”功能来创建.sql(该模型最初是使用“从数据库生成模型”功能创建的)
- 删除作用于现有表的.sql的所有部分,但在新旧表之间添加FK的部分除外
- 使用生成的脚本构建新数据库
听起来很干净,干嘛?错误。对于新表,从模型到数据库的映射都是错误的。简而言之,生成模型的数据库具有以复数形式命名的表(并且映射是正确的并且应用程序工作),并且由模型生成的数据库创建了复数表(与DB所在的表相同的名称)生成模型,但模型没有映射到它们)。最终解决方案是更改脚本以单数形式命名表格,然后一切都完美无瑕。
这里发生了什么?代码保持不变,没有对模型进行任何更改,旧表在整个过程中继续正常工作,但在某个过程中
- 生成脚本
- 删除“新”表和约束(已部署版本中尚不存在的那些)
- 运行脚本以重新添加表格
映射决定是单个命名的表(用户而不是用户,地址而不是地址等)。
任何人都可以向我解释为何这样做会发生这样的事情吗?
答案 0 :(得分:1)
您可能希望查看一些redgate提供的工具 - 用于比较两个DB结构和生成要更新的脚本的好工具。