2012-10-17 155 views
3

我正在尝试90天的天蓝色免费试用版。部署/发布网站和创建数据库非常容易,但由于某些原因,我的表格并未在数据库中创建。我使用实体框架4.4(我相信)并编写第一次迁移。我读过azure使用自己的连接字符串,但我继续并改变了我的连接字符串。我花了几个小时,我无法弄清楚什么是错的,为什么我的表没有被创建。我部署网站,启用迁移,添加迁移,更新数据库,然后发布并选中代码优先复选框。也许我的连接字符串错了?任何帮助是极大的赞赏。将MVC 4 CodeFirst部署到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本地数据库,这怎么可能?
+1

你找到一个解决办法? –

回答

3

关键疑难杂症要知道关于SQL Azure的连接:用户ID为它实际上通常需要以用户ID @服务器的名字 - 会读youruserid @ n98my ***在ConnectionString

。此外,不知道你是否需要“tcp:”(不使用它),你可能也想添加providerName =“System.Data.SqlClient”

+0

感谢您的评论,仍然没有运气。我几乎相信它不是我,而是一个天青数据库代码第一次迁移的bug。它不想工作。 – TMan

+0

但是我相信它可能是一个连接字符串问题,因为在包管理器中我看到当我启用迁移和更新数据库时,即使将连接字符串设置为我的天蓝色帐户,它也适用于本地数据库。不知道为什么。 – TMan

2

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

最初,你应该为天青的SQL Server创建登录,sometihing这样的: (执行以下服务器主数据库的SQL,与实际值进行替代的角度,括号中的数值)

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

然后连接到您的slutips_db数据库为admin并执行以下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 ***(用户@ 。服务器)格式

+0

我正在使用新的门户视图azure正在开发,所以当你创建一个网站时,如果你需要创建一个数据库和一个新的sql实例,包括创建用户名和密码来访问服务器。所以我不确定我会如何去做你的建议。 – TMan

+0

如果您安装了SQL管理工具(它非常方便 - 我强烈建议您安装并使用它),您可以简单地连接sql azure实例。如果你没有它 - 只需进入portal-> db->你的db->点击管理 - 有一个简单的基于silverlight的管理工具 - 你可以在那里执行提供的SQL。 您的数据库的链接应该是这样的 https://n98my***.database.windows.net/#$database=slutips_db –

+0

我在尝试执行时遇到此错误:CREATE USER语句必须是只在批处理中声明。 – TMan

0

如果你按照本教程:https://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/它会告诉你如何连接与Azure的Visual Studio(2012年在这个例子中,不知道是否适用于其他人) - 基本上你想要登录到门户,并下载发布凭证。这将包含您的数据库连接字符串,然后您可以使用该字符串将代码第一次迁移推送到Azure。

看起来您已经完成的工作是自己手动添加到app.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并重新发布

+0

生成的配置文件位于何处? –

+2

如果将源代码管理(TFService或Git)部署用于Azure,您如何执行迁移? –

+0

精彩的问题马克,我一直渴望知道的东西:) – Jack

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

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

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

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

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中的代码段)

0

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

如果确实造成密码数据库生成的连接字符串中被损坏,你必须将其复位:

  • 在Windows Azure管理,在SQL数据库选项卡,选择服务器列表(不数据库列表),并单击您的服务器
  • 在仪表盘上,有一个链接重设管理员密码
  • 在Visual Studio中,您发布的个人资料的的connectionString(设置更新密码,数据库)
  • 进行更改到web.conf IG(一个真实的,而不是评论),否则将无法重新发布
  • 发布,并在第一次使用的数据库中,迁移将被应用