预期的数据库模型实时不一致

时间:2011-09-29 19:57:03

标签: sql visual-studio-2010 sql-server-2005 asp.net-mvc-2 ado.net

this question中,我遇到了一个问题,即我正在为已部署的应用程序编写更新,以使数据库与我们正在部署的较新版本保持同步。基本概要如下:

  
      
  • 开始使用当前部署的应用程序版本
  •   
  • 添加了使用现有数据库的新功能
  •   
  • 添加了新的数据库表和关系
  •   
  • 添加了依赖于新数据库结构的新功能
  •   
  • 测试完成,可随时部署
  •   

这里的问题是,当前部署的应用程序已经使用了几个月,并且需要保留大量数据,因此简单地用新旧应用程序取代旧应用程序是不可行的(至少不适用于数据库,但当然它适用于代码)。因此,我使用以下步骤在SQL中编写脚本,以便在第一次启动时运行应用程序的更新版本,以便在不触及现有数据的情况下对数据库进行必要的更改(除了填充新表):

  
      
  • 使用VS2010的“从模型生成数据库”功能来创建.sql(该模型最初是使用“从数据库生成模型”功能创建的)
  •   
  • 删除作用于现有表的.sql的所有部分,但在新旧表之间添加FK的部分除外
  •   
  • 使用生成的脚本构建新数据库
  •   

听起来很干净,干嘛?错误。对于新表,从模型到数据库的映射都是错误的。简而言之,生成模型的数据库具有以复数形式命名的表(并且映射是正确的并且应用程序工作),并且由模型生成的数据库创建了复数表(与DB所在的表相同的名称)生成模型,但模型没有映射到它们)。最终解决方案是更改脚本以单数形式命名表格,然后一切都完美无瑕。

这里发生了什么?代码保持不变,没有对模型进行任何更改,旧表在整个过程中继续正常工作,但在某个过程中

  
      
  • 生成脚本
  •   
  • 删除“新”表和约束(已部署版本中尚不存在的那些)
  •   
  • 运行脚本以重新添加表格
  •   

映射决定是单个命名的表(用户而不是用户,地址而不是地址等)。

任何人都可以向我解释为何这样做会发生这样的事情吗?

1 个答案:

答案 0 :(得分:1)

您可能希望查看一些redgate提供的工具 - 用于比较两个DB结构和生成要更新的脚本的好工具。

http://www.red-gate.com/?utm_source=google&utm_medium=cpc&utm_content=brand_aware&utm_campaign=redgate&gclid=CIamkumgw6sCFcYPfAodnGVjsQ