在Azure Web App中设置EF连接字符串

Jac*_*hee 17 asp.net entity-framework azure azure-web-sites azure-sql-database

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

public partial class MyContext : DbContext
{
    public MyContext(string connectionName)
        : base("name=" + connectionName)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="metadata=...;provider connection string=&quot;...&quot;" 
         providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

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

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

不支持关键字:'数据源'.

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

不支持关键字:'元数据'.

这看起来真是一个简单的故事,所以我们想知道出了什么问题.

Jac*_*hee 24

问题是逃脱的报价:&quot;.

web.config中的连接字符串使用引号进行转义,因为它们是在XML属性中序列化的.在Azure门户中输入连接字符串时,应提供原始非转义字符串.像这样的东西:

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

David Ebbo的回答有助于确认环境是按照您的预期设置的.在Visual Studio中通过向导发布时,注意.pubxml文件也很有帮助:它也会尝试填充连接字符串.


Dav*_*bbo 10

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

尝试转到Kudu Console并单击Environment以确保conn字符串在那里看起来正确.


Maa*_*ope 6

如果您在 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" />
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

确保(如第一个答案中所述)替换&quot;为“


Nic*_*aid 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"
Run Code Online (Sandbox Code Playgroud)

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

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

首先是我的文件mBT.edmx

关于位Model.,请参阅此处@leqid的答案:MetadataException:无法加载指定的元数据资源

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