Функция Azure с использованием MySQL в приложении не может подключиться с помощью EF

У меня есть приложение с функциями Azure. Я включил функцию MySQLin App. Моя функция написана на C# с использованием EF Core. При попытке установить соединение с использованием MYSQLCONNSTR_localdb, как описано в документации, я получаю исключение в журналах.

Это мой код для создания DBContext:

   public partial class MyContext : DbContext
    {
        public static MyContext Factory(string connectionString)
        {

           //String returned from MYSQLCONNSTR_localdb     
           //Database=localdb;Data Source=127.0.0.1:50249;User Id=azure;Password=****
           var options = new DbContextOptionsBuilder<MyContext >()
                         .UseMySql(builder.ConnectionString)
                         .Options;      

           return new MyContext (options);

        }
    }

При выполнении следующего, я получаю следующее исключение: возникло исключение, вероятно, из-за временного сбоя. Рассмотрите возможность включения устойчивости к временным ошибкам, добавив EnableRetryOnFailure() к вызову UseMySql.

   using var dbcontext = MyContext.Factory(settings.ConnectionString);
   var result = dbcontext.Database.CanConnect();

1 ответ

Проблема в том, что строка подключения, предоставленная Azure, неверна:

Database=localdb;Data Source=127.0.0.1:50249;User Id=azure;Password=****

Вы не можете исправить формат и сохранить значение, потому что порт может измениться. Насколько я могу судить, это проблема службы Azure, которая существует уже более двух лет.

Этот код исправляет строку подключения:

var connectionString = Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb") 

public static MyContext Factory(string connectionString)
{
    {
        //WRONG: Database=localdb;Data Source=127.0.0.1:50249;User Id=azure;Password=****
        //CORRECT: server=127.0.0.1;userid=azure;password=XXXX;database=localdb;Port=nnnnn
        var builder = new System.Data.Common.DbConnectionStringBuilder();
        builder.ConnectionString = connectionString;

        object dataSource;
        if (builder.TryGetValue("Data Source", out dataSource))
        {
            var parts = dataSource.ToString().Split(":");
            builder.Remove("Data Source");
            builder.Add("server", parts[0]);
            builder.Add("Port", parts[1]);
        }

        var options = new DbContextOptionsBuilder<MyContext>()
                    .UseMySql(builder.ConnectionString)
                    .Options;      

        return new MyContext(options);
    }
Другие вопросы по тегам