我们有一个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
类型,我们会收到以下运行时错误:
不支持关键字:&#39;数据源&#39;。
对于SQL Server
或SQL Database
,我们收到以下运行时错误:
不支持关键字:&#39;元数据&#39;。
这看起来真是一个简单的故事,所以我们想知道出了什么问题。
答案 0 :(得分:20)
问题是转义引号:"
。
web.config中的连接字符串有引号转义,因为它们是在XML属性中序列化的。在Azure门户中输入连接字符串时,应提供原始非转义字符串。像这样:
metadata=...;provider connection string="Data Source=..."
David Ebbo的回答有助于确认环境是按照您的预期设置的。在Visual Studio中通过向导发布时,注意.pubxml文件也很有帮助:它也会尝试填充连接字符串。
答案 1 :(得分:9)
'custom'在这里应该是正确的。在这种情况下,providerName保持不变,因此如果您的配置中有System.Data.EntityClient
,那么在Azure运行时更改它之后应该保留它。
尝试转到Kudu Console并单击“环境”以确保conn字符串在那里看起来正确。
答案 2 :(得分:2)
如果你在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 portal中添加:
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
确保(如第一个答案中所述)将"
替换为&#34;
答案 3 :(得分:1)
除了记录已经记录的答案之外,只需记录我自己的经历
这是我最后的连接字符串(为清晰起见,在多行上)
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接受的字符串:
Models.mBT.csdl
(以及另外两个)来自:首先,mBT
是我的.edmx
文件的名称
关于Model.
位,请参见@leqid的答案:MetadataException: Unable to load the specified metadata resource
您可以检查obj目录,并查看这三个元数据文件在名为Models
的子文件夹中,因此您需要在Models.
之前加上