关于asp.net:在Azure Web App中设置EF连接字符串

Setting EF Connection String in Azure Web App

我们有一个ASP.NET(MVC)应用程序,正在使用Entity Framework 6连接到我们的数据库。dbContext是以标准方式构造的,它代表我们加载连接字符串。生成的代码如下所示:

1
2
3
4
5
6
7
public partial class MyContext : DbContext
{
    public MyContext(string connectionName)
        : base("name=" + connectionName)
    {
    }
}

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

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

当我们将应用程序发布到Azure时,我们导航到Azure门户,然后导航到Web应用程序的设置,然后导航到连接字符串列表。在这里,我们添加了我们在本地使用的ef连接字符串。当我们重新启动并访问应用程序时,根据我们选择的连接字符串类型,我们会得到一个运行时错误。

对于Custom类型,我们得到以下运行时错误:

Keyword not supported: 'data source'.

对于SQL ServerSQL Database我们得到以下运行时错误:

Keyword not supported: 'metadata'.

这似乎是一个直截了当的故事,所以我们想知道到底出了什么问题。


问题是转义的引号:"

web.config中的连接字符串已转义引号,因为它们在XML属性中序列化。在Azure门户中输入连接字符串时,应提供原始的未捕获字符串。像这样:

metadata=...;provider connection string="Data Source=..."

大卫·埃博的回答很好地证实了环境是按照你的期望建立的。在Visual Studio中通过向导发布时,注意.pubXML文件也很有帮助:它还将尝试填充连接字符串。


"自定义"应该在此处正确。在这种情况下,providerName保持不变,因此如果在配置中有System.Data.EntityClient,那么在Azure运行时更改它之后,它应该保持不变。

尝试转到kudu控制台并单击environment以确保conn字符串在那里看起来正确。


如果您在web.connfig中有这一行

1
 

在Azure门户中添加:

1
2
3
4
5
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

确保(如第一个回答中所述)将"替换为"


除了这里已经记录的答案之外,只记录我自己的经历

这是我最后的连接字符串(为了清晰起见,在多行上)

1
2
3
4
5
6
7
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:无法加载指定的元数据资源

您可以检查obj目录,发现这三个元数据文件位于名为Models的子文件夹中,因此需要预先准备Models.文件。