0

我有一个 Azure Function 应用程序。我已启用MySQLin App功能。我的函数是使用 EF Core 用 C# 编写的。当尝试使用记录的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();
4

1 回答 1

0

问题是 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);
    }
于 2020-01-24T20:10:21.953 回答