Настройка строки подключения EF в 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=&quot;...&quot;" 
         providerName="System.Data.EntityClient" />

Когда мы публикуем приложение для Azure, мы переходим к Azure Portal, затем к настройкам веб-приложения, а затем к списку строк подключения. Там мы добавляем строку подключения EF, которую мы использовали локально. Когда мы перезапускаем и посещаем приложение, мы получаем ошибку времени выполнения в зависимости от типа выбранной строки подключения.

Для типа Custom мы получаем следующую ошибку времени выполнения:

Ключевое слово не поддерживается: 'источник данных'.

Для SQL Server или SQL Database мы получаем следующую ошибку во время выполнения:

Ключевое слово не поддерживается: "метаданные".

Это действительно кажется простой историей, поэтому мы задаемся вопросом, что происходит не так.

Ответы

Ответ 1

Проблема заключается в экранированных кавычках: &quot;.

Строки подключения в web.config имеют кавычки, которые экранированы, потому что они сериализованы в атрибуте XML. При вводе строки соединения на портале Azure вы должны предоставить необработанную строку. Что-то вроде этого:

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

Ответ Дэвида Эббо хорош для подтверждения того, что среда настроена так, как вы ожидаете. Также полезно обратить внимание на файл .pubxml при публикации через мастер в Visual Studio: он попытается также заполнить строки подключения.

Ответ 2

'custom' должен быть правильным здесь. В этом случае имя поставщика остается неизменным, поэтому, если у вас есть System.Data.EntityClient в вашей конфигурации, он должен оставаться после изменения времени выполнения Azure.

Попытайтесь перейти на Kudu Console и нажмите "Среда", чтобы убедиться, что строка conn выглядит там корректно.

Ответ 3

Если у вас есть эта строка в web.connfig

<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" />

Добавьте это на лазурный портал:

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; на "