【发布时间】:2011-09-29 19:57:02
【问题描述】:
在this question 中,我遇到了一个问题,我正在为已部署的应用程序编写更新,以使数据库与我们正在部署的较新版本保持同步。基本大纲如下:
- 从当前部署的应用程序版本开始
- 添加了使用现有数据库的新功能
- 添加了新的数据库表和关系
- 添加了依赖于新数据库结构的新功能
- 测试完成,准备部署
这里的问题是当前部署的应用程序已经使用了几个月并且有很多数据需要保留,所以简单地用新的替换旧的是不可行的(至少对于数据库,但它当然适用于代码)。因此,我使用以下步骤在 SQL 中编写了一个脚本,以便更新版本的应用程序在第一次启动时运行,以便在不触及现有数据的情况下对数据库进行必要的更改(除了填充新表):
- 使用 VS2010 的“从模型生成数据库”功能创建 .sql(模型最初是使用“从数据库生成模型”功能创建的)
- 删除 .sql 中作用于现有表的所有部分,除了在新表和旧表之间添加 FK 的部分
- 使用生成的脚本构建新数据库
听起来很干净,对吧?错误的。从模型到数据库的映射对于新表来说都是错误的。长话短说,生成模型的数据库具有以复数形式命名的表(并且映射正确且应用程序有效),并且模型生成的数据库以复数形式创建表(与数据库所在的表名称相同)生成模型,但模型没有映射到它们)。解决方案最终是更改脚本以单数命名表,然后一切正常。
这里发生了什么?代码保持不变,模型没有做任何更改,旧表在整个过程中继续正常工作,但在某个过程中
- 生成脚本
- 删除“新”表和约束(部署版本中尚不存在的)
- 运行脚本以重新添加表格
映射决定为单一命名的表(用户而不是用户,地址而不是地址等)。
谁能向我解释这是如何/为什么会发生这种情况的?
【问题讨论】:
标签: sql visual-studio-2010 sql-server-2005 asp.net-mvc-2 ado.net