Функция 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);
}