这是一个很长的问题,但如果我能得到一些好的建议,我将非常感激。简而言之,我正在寻找一种用于 MS SQL 数据库架构版本升级的好方法,该架构还需要将数据从已删除的表移动到新表中。
我认为 Stack Overflow 是这个问题最合适的地方(不是 dba.stackexchange.com),因为从本质上讲,这是使用 Entity Framework 的 .NET 开发人员的问题,其中的数据库部分主要由自动生成的 sql 组成脚本。
背景
.NET 应用程序和 SQL 数据库正在 Azure 中运行(辅助角色中的应用程序和 Azure SQL 中的数据库)。到目前为止,版本升级工作正常,因为所有数据库架构更改都很简单(例如添加新列)。但是,从现在开始,我还需要在升级期间处理将数据从一个表移动到另一个表的问题。(我可以通过创建一个新数据库来临时解决这个问题,使用旧数据库中的数据生成一个脚本并手动编辑脚本以使其适合新模式,但我希望有更好的方法)。
我使用实体框架,我使用模型优先。实体和关联是在 Visual Studio 数据模型设计器中定义的,这种方法非常适合我的应用程序。
我使用 dacpac 升级 Azure SQL 数据库,这种方法到现在为止效果很好(但现在我会丢失数据,所以现在我必须找到一种方法将数据移动到新表中)。
我希望我可以继续使用实体框架并在设计器中定义实体/关联,但如果需要,可以从 dacpac 升级切换到另一种技术。
升级方法到现在
- 我在设计器中添加新实体(表)、关联(关系)和属性(列)。
- 我右键单击,选择“Generate Database from Model...”,这会生成一个 .sql 脚本,该脚本会删除旧的数据库对象并创建新的数据库对象。
- 我创建了一个空数据库并运行脚本来创建表/键等。
- 在 SQL Server Management Studio 中,我右键单击数据库并选择“Tasks -> Extract Data-tier Application...”。当向导完成时,我得到了我需要的 dacpac(实际上我现在可以删除数据库,因为我创建它只是为了能够获取 dacpac 文件,因为我认为我不能在 Visual Studio 数据模型设计器中生成它) .
- 我右键单击 Azure SQL 数据库并选择“任务 -> 升级数据层应用程序...”并按照向导进行操作。到目前为止,我从未丢失过数据,所以效果很好!
现在的情况
这是一个说明问题的简化示例,但从现在开始,我似乎会经常遇到几乎相同的情况。看下图中新旧版本的架构。假设数据库中已经有数据。我需要 ImageFile 中的数据最终以 ImageFileOriginal 或 ImageFileProcessed 结尾,具体取决于 IsOriginal 布尔/位值。使用“升级数据层应用程序”我会收到有关数据丢失的警报。你会推荐什么方法来处理这个问题?正如我之前所说,如果需要,可以从 dacpac 升级切换到另一种技术。
我已经阅读了 Visual Studio Database Projects、Fluent Migrator、Red Gate 和 Entity Designer Database Generation Power Pack(它不支持 Visual Studio 2012),但我没有找到一个好的方法。我承认我没有花一整天时间深入研究每种技术,但我确实花了一些时间来尝试找到一个好的方法。