我无法运行迁移来创建/更新我在Azure上托管的Sql Db。它们本地运行到我的LocalDb,但在发布到Azure时似乎完全被忽略了。
详细说明: - Asp.Net MVC 5.2.3 - 实体框架6.1.3 - Visual Studio团队服务(在线) - Azure Web App& Azure SQL Db(在Imagine / Dreamspark订阅下)
我创建了一个不使用CI的不同应用程序,但使用了Visual Studio中的“发布”功能,它发布得很好并且工作正常。我已经删除了该网络应用程序&来自Azure的db,因为订阅只允许一个db。
我认为这可能是我在VSTS中设置构建定义时所缺少的,我只是不确定是什么。
我试过了:
......以及其他一些人(我没有打开窗户,或者我也将它们连接起来)。
我目前的构建步骤包括:
在我的本地环境中,EF在我启用迁移,添加迁移,更新数据库时工作。我猜这些步骤都没有这样做,所以我需要一个或多个步骤。 Ben Day的博客似乎应该可行,但出于某种原因,它没有找到我的bin / release文件。
实际的应用程序在发布上述成功的构建定义后就可以很好地部署到Azure。只是数据库被完全忽略了。使用SSMS,我检查Azure数据库,虽然它存在但它没有我的表或数据。
我错过了什么?
感谢。
**编辑 - 找到了我遗漏的简单项目。我需要将数据库的连接字符串添加到Azure中的Web应用程序。它现在有我的初始表,并使用这些表存储数据,但不会进行迁移。所以我在过去两天里做的事情让我的初始表格出现了。现在..要记住它是什么。
** 2nd Edit - 所以,我认为在我修复VSTS中的连接字符串之前,这些表已进入发行版db。我尝试的其中一件事是创建一个单独的数据库项目。我想当我在某个时候推动它时,当时存在的表也推动释放,我只是看不到它们,因为我没有将应用程序和数据库连接在一起?无论如何,EF迁移仍未被识别。我再次尝试了Ben Day的建议,但我收到了构建错误:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
我使用的是EF 6.1.3
答案 0 :(得分:1)
我也遇到了这个问题。我正在使用Visual Studio发布我的Azure应用服务。经过研究(https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application#deploy-to-azure),我了解到,当您在“发布”设置中选中“更新数据库”复选框时,VS Publish会转换您的Web配置,并添加一个指向包含_migrations表的数据库的连接字符串,以及“ entityFramework”下的“上下文”元素。您可以通过查看“ ..obj \ Release \ InsertEFCodeFirstDeploy \ transformed \ web.config”来查看先前发布的web.config文件。
因此,为了在VSTS中使用构建和发行定义时重新创建相同的操作,我在服务项目的Web.Release.config中添加了2个XDT“插入”转换。我的看起来像这样:
<?xml version="1.0"?>
<!-- For more information on using Web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=301874 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MS_TableConnectionString_DatabasePublish" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=AzureStorageEmulatorDb45;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True"
providerName="System.Data.SqlClient" xdt:Transform="Insert" />
</connectionStrings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
<entityFramework>
<contexts xdt:Transform="Insert">
<context type="helpmeshopService.Models.helpmeshopContext, helpmeshopService">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[helpmeshopService.Models.helpmeshopContext, helpmeshopService], [helpmeshopService.Migrations.Configuration, helpmeshopService]], EntityFramework, PublicKeyToken=b77a5c561934e089">
<parameters>
<parameter value="MS_TableConnectionString_DatabasePublish" />
</parameters>
</databaseInitializer>
</context>
</contexts>
</entityFramework>
</configuration>
接下来,您将需要转到Azure门户中的应用程序服务“应用程序设置”,并添加名称为“ MS_TableConnectionString_DatabasePublish”的连接字符串,并将其值设置为与应该已经与“ MS_TableConnectionString”相同的值存在于您的设置中。