在Azure Web应用程序中设置EF连接字符串

22
我们有一个ASP .NET (MVC)应用程序,并且正在使用Entity Framework 6连接我们的数据库。 DbContext是以标准方式构建的,并且它会代替我们加载连接字符串。生成的代码如下:

=>
public partial class MyContext : DbContext
{
    public MyContext(string connectionName)
        : base("name=" + connectionName)
    {
    }
}

我们以标准的方式在本地的web.config文件中设置连接字符串:

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="metadata=...;provider connection string=&quot;...&quot;" 
         providerName="System.Data.EntityClient" />

当我们将应用程序发布到Azure时,我们会导航到Azure门户,然后进入Web应用程序的“设置”,然后进入连接字符串列表。 在那里,我们添加了我们在本地使用过的EF连接字符串。当我们重新启动并访问应用程序时,根据我们选择的连接字符串类型,我们会收到运行时错误。
对于“自定义”类型,我们会收到以下运行时错误:
“关键字不受支持:'data source'。”
对于“SQL Server”或“SQL Database”,我们会收到以下运行时错误:
“关键字不受支持:'metadata'。”
这似乎是一个简单明了的故事,所以我们想知道出了什么问题。

请看这里:http://azure.microsoft.com/blog/2013/07/17/windows-azure-web-sites-how-application-strings-and-connection-strings-work/ - Fals
4个回答

35
问题在于转义的引号:&quot;
Web.config中的连接字符串由于以XML属性序列化而需要转义引号。在Azure门户中输入连接字符串时,应该提供未转义的原始字符串。类似这样的内容: metadata=...;provider connection string="Data Source=..." David Ebbo的答案确保环境设置符合预期,对于通过Visual Studio向导发布时请注意.pubxml文件:它将尝试填充连接字符串。

1
我有同样的问题,在花费很长时间搜索后,我还没有找到解决方案。Azure只是忽略应用程序设置并使用web.config中的连接字符串。正如我在Channel 9视频中看到的那样,这应该是“神奇”的,但实际上并不是。 - Marcelo Sader
请注意,在 Azure Web 应用程序中,仍然需要 web.config connectionstrings。只有 connectionString 部分将被替换为 Azure Web 应用程序运行时从您的环境中读取的内容。 - Antonio Buonaiuto

14

'custom'应该放在这里是正确的。 在这种情况下,providerName保持不变,因此,如果您的配置中有System.Data.EntityClient,那么在Azure运行时更改之后,它应该保持不变。

尝试转到Kudu Console并单击“Environment”以确保连接字符串在那里看起来正确。


9
如果你在web.config文件中有这一行:
<add name="Entities" connectionString="metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX&quot;" providerName="System.Data.EntityClient" />

请在Azure门户中添加以下内容:
Name Column => Entities

Value Column => metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX" 

"Custom" - In the drop selection box

请确保(如第一个答案所述)用“”替换&quot;.

5

以下是我个人的经验,除了这里已经记录的答案

这是我的最终连接字符串(为了清晰起见,跨越多行)

metadata=res://*/Models.mBT.csdl|res://*/Models.mBT.ssdl|res://*/Models.mBT.msl;
provider=System.Data.SqlClient;
provider connection string="
  Data Source=tcp:myazureserver.database.windows.net,1433;
  Initial Catalog=databasename;
  User ID=z@myazureserver;
  Password=xyz"

要将“普通”连接字符串转换为EF接受的连接字符串:

  • 应用程序设置中的连接字符串类型必须为“其他”,而不是“SQL Azure”
  • 连接字符串值会自动替换在web.config中发布的任何内容
  • 元数据名称Models.mBT.csdl(以及其他两个)来自于此:

首先,mBT是我的.edmx文件的名称

关于Model.部分,请参见@leqid在此处的答案:MetadataException: Unable to load the specified metadata resource

您可以检查您的obj目录并查看这三个元数据文件位于名为Models的子文件夹中,因此您需要在前面添加Models。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接