在 Azure Web App 中设置 EF 连接字符串
Setting EF Connection String in Azure Web App
我们有一个 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="...""
providerName="System.Data.EntityClient" />
当我们将应用程序发布到 Azure 时,我们导航到 Azure 门户,然后导航到 Web 应用程序的设置,然后导航到连接字符串列表。在那里我们添加了我们在本地使用的 EF 连接字符串。当我们重新启动并访问该应用程序时,我们会收到 运行 次错误,具体取决于我们选择的连接字符串类型。
对于 Custom
类型,我们得到以下 运行 时间错误:
Keyword not supported: 'data source'.
对于 SQL Server
或 SQL Database
,我们得到以下 运行 时间错误:
Keyword not supported: 'metadata'.
这看起来真的很简单,所以我们想知道出了什么问题。
'custom'这里应该是正确的。在这种情况下,providerName 保持不变,因此如果您的配置中有 System.Data.EntityClient
,那么在 Azure 运行时更改它后应该保持不变。
尝试转到 Kudu Console 并单击“环境”以确保那里的连接字符串看起来正确。
问题是转义引号:"
。
web.config 中的连接字符串对引号进行了转义,因为它们在 XML 属性中进行了序列化。在 Azure 门户中输入连接字符串时,您应该提供原始的未转义字符串。像这样:
metadata=...;provider connection string="Data Source=..."
David Ebbo 的回答有助于确认环境已按照您的预期设置。在 Visual Studio 中通过向导发布时注意 .pubxml 文件也很有帮助:它也会尝试填充连接字符串。
如果你在web.connfig
中有这一行
<add name="Entities" connectionString="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"" 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
确保(如第一个答案中所述)将 "
替换为“
除了这里已经记录的答案,只是记录我自己的经历
这是我的最终连接字符串(为清楚起见,在多行上)
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"
从 "normal" 连接字符串转换为 EF 接受的连接字符串:
- 应用程序设置中的连接字符串类型必须是 "other" 而不是 "SQL Azure"
- 连接字符串值自动替换 web.config
中发布的任何内容
- 元数据名称
Models.mBT.csdl
(以及另外两个)来自于:
首先,mBT
是我的 .edmx
文件的名称
关于 Model.
位,请参阅@leqid 的回答:MetadataException: Unable to load the specified metadata resource
您可以检查您的 obj 目录,看到这三个元数据文件位于名为 Models
的子文件夹中,因此您需要在前面添加 Models.
我们有一个 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="...""
providerName="System.Data.EntityClient" />
当我们将应用程序发布到 Azure 时,我们导航到 Azure 门户,然后导航到 Web 应用程序的设置,然后导航到连接字符串列表。在那里我们添加了我们在本地使用的 EF 连接字符串。当我们重新启动并访问该应用程序时,我们会收到 运行 次错误,具体取决于我们选择的连接字符串类型。
对于 Custom
类型,我们得到以下 运行 时间错误:
Keyword not supported: 'data source'.
对于 SQL Server
或 SQL Database
,我们得到以下 运行 时间错误:
Keyword not supported: 'metadata'.
这看起来真的很简单,所以我们想知道出了什么问题。
'custom'这里应该是正确的。在这种情况下,providerName 保持不变,因此如果您的配置中有 System.Data.EntityClient
,那么在 Azure 运行时更改它后应该保持不变。
尝试转到 Kudu Console 并单击“环境”以确保那里的连接字符串看起来正确。
问题是转义引号:"
。
web.config 中的连接字符串对引号进行了转义,因为它们在 XML 属性中进行了序列化。在 Azure 门户中输入连接字符串时,您应该提供原始的未转义字符串。像这样:
metadata=...;provider connection string="Data Source=..."
David Ebbo 的回答有助于确认环境已按照您的预期设置。在 Visual Studio 中通过向导发布时注意 .pubxml 文件也很有帮助:它也会尝试填充连接字符串。
如果你在web.connfig
中有这一行<add name="Entities" connectionString="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"" 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
确保(如第一个答案中所述)将 "
替换为“
除了这里已经记录的答案,只是记录我自己的经历
这是我的最终连接字符串(为清楚起见,在多行上)
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"
从 "normal" 连接字符串转换为 EF 接受的连接字符串:
- 应用程序设置中的连接字符串类型必须是 "other" 而不是 "SQL Azure"
- 连接字符串值自动替换 web.config 中发布的任何内容
- 元数据名称
Models.mBT.csdl
(以及另外两个)来自于:
首先,mBT
是我的 .edmx
文件的名称
关于 Model.
位,请参阅@leqid 的回答:MetadataException: Unable to load the specified metadata resource
您可以检查您的 obj 目录,看到这三个元数据文件位于名为 Models
的子文件夹中,因此您需要在前面添加 Models.