Asp.Net EF Code首次与VSTS持续集成 - Azure Sql Db未部署

时间:2017-02-12 15:02:09

标签: asp.net-mvc-5 azure-web-sites ef-migrations azure-pipelines dreamspark

我无法运行迁移来创建/更新我在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中设置构建定义时所缺少的,我只是不确定是什么。

我试过了:

......以及其他一些人(我没有打开窗户,或者我也将它们连接起来)。

我目前的构建步骤包括:

  1. NuGet restore - NuGet Installer
  2. 构建解决方案 - Visual Studio Build
  3. 测试程序集 - Visual Studio测试
  4. 发布符号路径 - 索引来源&发布符号
  5. 发布工件 - 发布构建工件
  6. 在我的本地环境中,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

1 个答案:

答案 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”相同的值存在于您的设置中。