【问题标题】:Deploying MVC 4 CodeFirst to Azure将 MVC 4 CodeFirst 部署到 Azure
【发布时间】:2012-10-17 00:57:46
【问题描述】:

我正在尝试 90 天免费试用 azure。部署/发布网站和创建数据库非常容易,但由于某种原因,我的表没有在数据库中创建。我正在使用实体框架 4.4(我相信)和代码优先迁移。我读过 azure 使用它自己的连接字符串,但我继续更改了我的连接字符串。我花了几个小时在这上面,我不知道出了什么问题以及为什么我的表没有被创建。我部署网站、启用迁移、添加迁移、更新数据库,然后通过选中代码优先复选框进行发布。也许我的连接字符串是错误的?任何帮助是极大的赞赏。

在“MyProject.Web”web.config 中:

<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=tcp:n98my***.database.windows.net,1433;Initial Catalog=slutips_db;User Id=****;Password=****;" />
</connectionStrings>

然后在 'MyProject.Data' app.config 中保存我的 datacontext.cs:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<contexts>
  <context type="SeluCmpsTutorials.Data.DataContext">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion">
      <parameters>
        <parameter value="slutips_db"/>
      </parameters>
    </databaseInitializer>
  </context>
</contexts>
</entityFramework>
  • 我还注意到,即使我的所有连接字符串都已更改,当我添加迁移和更新数据库时,它仍然使用 ./sqlexpress 本地数据库,这怎么可能?

【问题讨论】:

  • 您找到解决方案了吗?

标签: asp.net-mvc azure asp.net-mvc-4 azure-sql-database


【解决方案1】:

关于 sql azure 连接需要注意的关键问题:对于用户 ID,它实际上通常需要是用户 ID @服务器名称 - 会在连接字符串中读取 youruserid@n98my***。

另外,不确定您是否需要“tcp:”(不使用它),您可能还想添加 providerName="System.Data.SqlClient"

【讨论】:

  • 感谢您的评论,仍然没有运气。我几乎相信这不是我,而是 azure 数据库代码首次迁移的错误。但它不想工作。
  • 但是我确实认为这可能是一个连接字符串问题,因为在包管理器中我看到当我启用迁移和更新数据库时,它适用于我的本地数据库,即使我将连接字符串设置为我的天蓝色帐户。不知道为什么。
【解决方案2】:

您的 db 用户是否有必要的数据库修改权限? 您是如何设置用户的?

最初,您应该为 Azure sql 服务器创建登录名,如下所示: (在您的服务器主数据库上执行以下sql,将尖括号值替换为实际值)

CREATE LOGIN [&lt;SomeServerLogin&gt;] WITH PASSWORD=N'&lt;somepassword&gt;'

然后以管理员身份连接到您的 slutips_db 数据库并执行以下 sql

CREATE USER [<slutips_db_user>] FROM LOGIN [<SomeServerLogin>];
GO;
EXEC sp_addrolemember 'dbmanager', '<slutips_db_user>';
GO;
EXEC sp_addrolemember 'loginmanager', '<slutips_db_user>';
GO;

“dbmanager”角色允许创建\管理表。

'loginmanager' 角色允许在当前数据库中创建另一个用户(您的 slutips_db_user 将被允许执行CREATE USER &lt;slutips_db_user1&gt; FROM LOGIN &lt;SomeServerLogin1&gt; 子句

Edit1:另外 - 确保您的连接字符串用户具有 user@n98my*** (user@server) 格式。

【讨论】:

  • 我正在使用 azure 正在开发的新门户视图,因此当您创建网站时,如果您需要一个数据库和一个新的 sql 实例,包括创建用户名和密码以访问服务器。所以我不确定我会如何去做你的建议。
  • 如果您安装了 SQL 管理工具,您可以简单地连接 sql azure 实例(它非常方便 - 我强烈建议您安装和使用它)。如果你没有它 - 只需转到门户 - > db - > 你的 db - > 单击管理 - 有一个简单的基于 silverlight 的管理工具 - 你可以在那里执行提供的 SQL。您的数据库的链接应该是这样的 n98my***.database.windows.net/#$database=slutips_db
  • 我在尝试执行时遇到此错误:CREATE USER 语句必须是批处理中的唯一语句。
  • 所以我添加了用户,仍然没有运气。我尝试了一切似乎。没有任何方法可以创建这些表。
【解决方案3】:

如果您遵循本教程:https://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/ 它将向您展示如何将 Visual Studio(示例中为 2012,不确定是否适用于其他任何人)与 Azure - 基本上您想登录门户并下载发布凭据。这将包含您的数据库连接字符串,然后您可以使用该字符串将代码优先迁移到 Azure。

看起来您所做的是手动将属性添加到 app.config 中。发布的工作方式,它在您的 .config 文件中定义一个本地版本,如下所示:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

然后,当您发布时,VS 会自动将所需的内容插入到您的 .config 中 - 如果我通过 FTP 到我的网站并查看生成的 .config 文件,您会看到:

<contexts>
  <context type="Web_App.Models.TrackSafeDb, Web App">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Web_App.Models.TrackSafeDb, Web App], [Web_App.Migrations.Configuration, Web App]], EntityFramework, PublicKeyToken=*******************">
      <parameters>
        <parameter value="Web_App.Models.TrackSafeDb_DatabasePublish" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

所以我会尝试从您的本地 app.config 中删除无关的内容并重新发布

【讨论】:

  • 生成的配置文件在哪里?
  • 如果您使用源代码控制(TFService 或 Git)部署到 Azure,如何执行迁移?
  • 奇妙的问号,我一直很想知道 :)
【解决方案4】:

尝试为您的连接字符串添加加密...

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=tcp:n98my***.database.windows.net,1433;Initial Catalog=slutips_db;User Id=****;Password=****;Integrated Security=False;Persist Security Info=True;Encrypt=True" />
</connectionStrings>

【讨论】:

    【解决方案5】:

    我所做的是转到我的 azure 管理门户。 点击数据库。 查看连接字符串,然后将它们直接复制到我的相关配置中。 在我的情况下,它的“发布”配置。

    确保网络配置转换已启用并正常工作。

    还要确保您已启用对每个数据库的防火墙访问... 您必须单击“启用通过防火墙连接”或类似的东西。 它在门户上的 db 选项中。

    【讨论】:

      【解决方案6】:

      看了几天这个问题,有几个想法。首先,您的上下文名称实际上是 DefaultConnection。实体框架(为了与无参数构造函数一起使用)喜欢连接字符串名称以匹配上下文名称。

      例如,如果您这样声明一个新的上下文变量:

      var context = new MyEntities();
      

      那么你的连接字符串应该叫MyEntities

      <connectionStrings>
      <add name="MyEntities" connectionString="Data Source=tcp:n98my***.database.windows.net,1433;Initial Catalog=slutips_db;User Id=****;Password=****;" />
      </connectionStrings>
      

      其次,您是否 100% 确定没有 web.config 转换文件和/或您还正确更新了这些文件中的连接字符串?

      第三,请记住,在部署时,除了 web.config 之外的任何配置文件基本上都会被忽略。执行程序集是 Web 应用程序,而不是数据项目或任何其他项目。任何与 EF 设置和部署相关的配置都应位于 web.config 文件中(如您在数据 app.config 中的 sn-p)

      【讨论】:

        【解决方案7】:

        我遇到了完全相同的问题,它与包含“%”字符的密码相关联。 我检查了 Azure 上与 ftp 连接的结果 web.config,我的密码部分包含“95%a”变成了“95ª”......自动。这可能是 azure 的 Web 部署功能中的错误,因为我在本地发布配置文件中的密码是正确的。

        如果生成的数据库密码确实在生成的连接字符串中损坏,则必须重置它:

        • 在 Windows Azure 管理的 SQL DATABASES 选项卡中,选择 SERVERS 列表(不是 DATABASE 列表)并单击您的服务器
        • 在仪表板中,有一个重置管理员密码的链接
        • 在 Visual Studio 中,更新发布配置文件的 connectionString(设置、数据库)中的密码
        • 对 web.config 进行更改(真实的,不是评论),否则将不会重新发布
        • 发布,并在首次使用数据库时应用迁移

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 2020-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多