Sql server 使用具有版本控制的MVC.net更新SQL Server数据库架构

Sql server 使用具有版本控制的MVC.net更新SQL Server数据库架构,sql-server,asp.net-mvc,azure-web-app-service,azure-sql-database,Sql Server,Asp.net Mvc,Azure Web App Service,Azure Sql Database,我们正在使用托管在Azure上的SQL Server数据库和web应用程序。我们在带有version列的表中维护数据库版本 我们在应用程序_Start()中添加了代码,以检查数据库的版本,并从我们的ASP.NET MVC应用程序中执行版本高于当前版本的命令来升级架构 直到最近我们才注意到,应用程序启动事件在几秒钟内再次触发,升级模式功能运行了两次 我们如何通过添加一些检查来防止升级架构,检查是否有另一个实例升级架构,或者是否有方法不多次触发应用程序\u Start事件 我们使用azuredevo

我们正在使用托管在Azure上的SQL Server数据库和web应用程序。我们在带有version列的表中维护数据库版本

我们在
应用程序_Start()
中添加了代码,以检查数据库的版本,并从我们的ASP.NET MVC应用程序中执行版本高于当前版本的命令来升级架构

直到最近我们才注意到,
应用程序启动
事件在几秒钟内再次触发,升级模式功能运行了两次

我们如何通过添加一些检查来防止升级架构,检查是否有另一个实例升级架构,或者是否有方法不多次触发
应用程序\u Start
事件

我们使用azuredevops管道将代码部署到web应用程序


谢谢大家!

您的web应用程序可以回收,原因有多种,超出您的控制范围。因此,将代码放在Application_Start中以运行使数据库更新的脚本并不是最佳的,原因正如您刚才提到的

由于您已经在使用一个Dev-Ops管道,因此有一种内置的方法可以将其作为部署的一部分来处理。在VisualStudio中签出数据库项目类型。这将允许您以文本形式编写所有表、存储过程、视图等的脚本,并将其置于源代码控制之下。然后,作为Dev Ops管道的一部分,您可以使用构建数据库项目并创建一个DACPAC作为输出。然后,使用获取DACPAC输出并将其部署到Azure SQL实例


这样,您就可以在完成生产部署之前知道您的数据库已经升级。

谢谢Rob!我们将尝试这一长期解决方案。在此之前,我们将向版本号列添加唯一约束。因此,在并行执行的情况下,执行中的一个将在尝试相同版本号时失败,并且不会对复制的主数据记录造成问题。@ SurrutPalaJaje另一个考虑的选项是EF迁移()。它基本上是有条件应用的生成代码。短期内,您可能会对这种方法感到更舒服。但我认为DevOps管道方法更优越。谢谢Rob的建议!我们将对此进行调查。我们目前在我们的项目中没有使用EF。这是否要求我们在项目中实施EF?还是有别的选择?我相信是的。您不必在应用程序中实际使用EF,但我相信您需要设置EF上下文并使EF模型与数据库保持同步。如果你还没有使用EF,我想这将是一个巨大的麻烦。谢谢你的输入罗布!