Azure Функция с использованием MySQL В приложении не удается подключиться с помощью EF - PullRequest
0 голосов
/ 24 января 2020

У меня есть приложение Azure Function. Я включил функцию MySQLin App . Моя функция написана на C# с использованием EF Core. При попытке установить sh соединение с использованием 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 () к вызову «Использовать MySql».

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

1 Ответ

0 голосов
/ 24 января 2020

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

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

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

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

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);
    }
...