将MVC 4 CodeFirst部署到Azure

时间:2012-10-17 00:57:47

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

我正在尝试对天蓝色的90天免费试用。部署/发布网站和创建数据库非常容易,但由于某种原因,我的表没有在数据库中创建。我正在使用实体框架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本地数据库,这怎么可能?

7 个答案:

答案 0 :(得分:3)

要知道关于sql azure连接的关键问题:对于userid,它实际上通常需要是用户id @ server name - 请在连接字符串中读取你的用户名@ n98my ***。

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

答案 1 :(得分:2)

您的db用户是否具有数据库修改所需的权限? 你是如何设置用户的?

最初你应该为Azure sql server创建登录,像这样: (在服务器主数据库上执行以下sql,用实际值替换尖括号值)

CREATE LOGIN [<SomeServerLogin>] WITH PASSWORD=N'<somepassword>'

然后以admin身份连接到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 <slutips_db_user1> FROM LOGIN <SomeServerLogin1>子句

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

答案 2 :(得分:0)

如果您按照本教程进行操作:https://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/它将向您展示如何使用Azure连接Visual Studio(示例中的2012,不确定是否适用于任何其他内容) - 基本上您想要登录门户网站,并下载发布凭据。这将包含您的数据库连接字符串,然后您可以使用该字符串将代码首次迁移到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中删除无关的内容并重新发布

答案 3 :(得分:0)

尝试在连接字符串中添加加密...

<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>

答案 4 :(得分:0)

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

确保启用了Web配置转换并正常工作。

还要确保您已启用每个数据库的防火墙访问权限... 你必须点击“通过防火墙启用连接”或类似的东西。 它位于门户网站上的数据库选项中。

答案 5 :(得分:0)

看了几天这个问题后,有几个想法。首先,您的上下文的名称实际上是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中的代码片段一样)

答案 6 :(得分:0)

我遇到了完全相同的问题,并且链接到包含'%'字符的密码。 我检查了连接到ftp的Azure上生成的web.config,以及包含'95%a'的密码部分转为'95ª'...自动生成。这可能是azure的Web部署功能中的一个错误,因为密码在我的本地发布配置文件中是正确的。

如果生成的连接字符串中生成的DB密码确实已损坏,则必须将其重置:

  • 从Windows Azure管理,在SQL DATABASES选项卡中,选择SERVERS列表(而不是DATABASE列表)并单击您的服务器
  • 在信息中心中,有一个重置管理员密码的链接
  • 在visual studio中,更新发布配置文件的connectionString(设置,数据库)中的密码
  • 更改web.config(真实的,不是评论),或者不会重新发布
  • 发布,首次使用数据库时,将应用迁移