mysql - Azure Web应用程序+ MySQL和 Entity Framework : The system cannot find the file specified

标签 mysql entity-framework azure azure-web-app-service

我刚刚使用 Web 应用程序 + MySQL 应用程序服务在 azure 上部署了我的 Web 应用程序。 我对数据库使用 Entity Framework ,部署后出现“系统找不到指定的文件”异常。我认为它必须对连接字符串做一些事情。我认为应用程序实际上无法连接数据库。 我花了很多天试图弄清楚如何解决它。我已经阅读了很多关于此的教程,但没有成功。

Application Settings

MySQL in App

我只能发布2张图片。

这是我使用的DbContext 要创建 LocalDB,我不知道如何更改它以与 Azure 上的数据库建立连接。

public class AppDbContext : DbContext
{
public AppDbContext() : base("Valtrends")
    {
        InitializeDbContext();   
    }

    public DbSet<FactorType> FactorTypes { get; set; }
    public DbSet<ComplexType> ComplexTypes { get; set; }
    public DbSet<Value> Values { get; set; }
    public DbSet<DataLoader.Entities.Version> Versions { get; set; }
    public DbSet<DefaultPlotData> DefaultPlotData { get; set; }
    public DbSet<GraphBucket> GraphBuckets { get; set; }
    public DbSet<XfactorFrom> XfactorsFrom { get; set; }
    public DbSet<XfactorTo> XfactorsTo { get; set; }
    public DbSet<DistributionData> DistributionData { get; set; }
    public DbSet<Bin> Bins { get; set; }
    public DbSet<DefaultPlotSettings> DefaultPlotSettings { get; set; }

    private void InitializeDbContext()
    {
        Database.SetInitializer(new AppDbInitializer());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FactorType>().HasMany(m => m.CompatibilityListXY).WithMany();
    }

}                         

最佳答案

如果你想在应用程序内使用MySQL,我建议你首先使用ftp找到连接字符串。

您可以首先设置部署凭据并使用此用户名和密码访问网络应用程序的 ftp。如下图所示:

设置部署凭据。 enter image description here

找到mysql文件夹并找到MYSQLCONNSTR_localdb.txt如下:

路径:ftp://{url}.ftp.azurewebsites.windows.net/data/mysql/

enter image description here

您将找到如下连接字符串:

Database=localdb;Data Source=127.0.0.1:52739;User Id=azure;Password=6#vWHD_$

注意:您的网络配置中正确的连接字符串如下所示,您从txt中获取的连接字符串是错误的:

Database=azuredb;Data Source=127.0.0.1;User Id=azure;Password=6#vWHD_$;port=52739

更新:我建议您可以使用 GetEnvironmentVariable 方法来获取连接字符串,因为如果重新启动 Web 服务,您的 my sql 的端口将会更改。您可以尝试下面的代码来获取连接字符串并将其转换为正确的格式。

获取连接字符串并格式化它示例:

  public static string connStrToArray()
        {
            string connStr = Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb").ToString();
            string[] connArray = Regex.Split(connStr, ";");
            string connectionstring = null;
            for (int i = 0; i < connArray.Length; i++)
            {

                if (i == 1)
                {
                    string[] datasource = Regex.Split(connArray[i], ":");
                    connectionstring += datasource[0] + string.Format(";port={0};", datasource[1]);
                }
                else
                {
                    connectionstring += connArray[i] + ";";
                }
            }

            return connectionstring;
        }

此外,我猜你的localdb使用的是sql服务器,如果你想使用mysql成为EF数据服务器提供者,你需要安装MySql.Data.Entity(你可以在Nuget包中找到它)并使用数据库.SetInitializer 将 SqlGenerator 设置为 MySqlClient。

更多详细信息,您可以引用以下dbcontext代码:

namespace TestForMySQL
{
    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using System.Text.RegularExpressions;

    public class MyContext : DbContext
    {

        public static string connStrToArray()
        {
            string connStr = Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb").ToString();
            string[] connArray = Regex.Split(connStr, ";");
            string connectionstring = null;
            for (int i = 0; i < connArray.Length; i++)
            {

                if (i == 1)
                {
                    string[] datasource = Regex.Split(connArray[i], ":");
                    connectionstring += datasource[0] + string.Format(";port={0};", datasource[1]);
                }
                else
                {
                    connectionstring += connArray[i] + ";";
                }
            }

            return connectionstring;
        }

        public MyContext( )
        {

            this.Database.Connection.ConnectionString = connStrToArray();
        }

        static MyContext()
        {

            //This is important
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
        }


        public virtual DbSet<Mytest> MyEntities2 { get; set; }
    }

    internal sealed class Configuration : DbMigrationsConfiguration<TestForMySQL.MyContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            //Change the SqlGenerator to MySql very important
            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());

        }

        protected override void Seed(TestForMySQL.MyContext context)
        {
            context.MyEntities2.AddOrUpdate(new Mytest()
            {
                Id = 1
            });
            context.SaveChanges();
        }
    }

    public class Mytest
    {
        public int Id { get; set; }

    }
}
<小时/>

what does the url in :ftp://{url}.ftp.azurewebsites.windows.net/data/mysql/ stand for? The URL of the app service doesn't work for me

您可以在概述中找到 ftp url 和用户名,如下所示:

查看 FTP 主机名和 FTP/部署用户名。

enter image description here

<小时/>

更新:

I have changed the credentials, but I have only URL, App Service plan/pricing tier and Continuous delivery status in the right column of Essentials

您可以下载包含 ftp URL 的发布配置文件。

见下图:

enter image description here

文件:

enter image description here

<小时/>

此外,还有另一种方法可以找到存储连接字符串。

您可以使用 kudu 工具直接查看 Web 服务中的文件。

更多详细信息,您可以引用以下步骤。

1.在DEVELOPMENT TOOLS中找到Advanced Tools点击进入。

enter image description here

  • 单击 dubug 控制台的 cmd。 enter image description here
  • 3.找到正确的文件夹(data\mysql)并找到MYSQLCONNSTR_localdb.txt文件。 单击编辑按钮。 enter image description here

    关于mysql - Azure Web应用程序+ MySQL和 Entity Framework : The system cannot find the file specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43718144/

    相关文章:

    java - 如何将总和放入字符串中并打印它

    c# - Entity Framework 6 - 多个 DefaultConnectionFactory?

    python - Azure 服务主体的 key 凭据和密码凭据之间的区别?

    sql - 如何向 Azure SQL 数据库中的用户授予数据库范围凭据

    c# - CosmosDb 使用 insertMany 请求率很大

    java - 我怎样才能使这个统计查询动态?

    php - 使用 prepare 命令更新我的表,将值增加 2

    mysql - select 中的 SQL 循环

    .net - Entity Framework 中的复合键在 uwp 中使用 sqlite

    c# - Entity Framework 代码优先,不生成数据库