You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6连接Azure MySQL时EF Core迁移报错求助

问题描述

我正在开发一个API,使用Entity Framework Core,从SQLite数据库迁移到Azure托管的MySQL数据库。参考MySQL官方文档编写了MySqlContext代码后,执行Add-Migration InitialCreate命令时抛出错误:

Method not found: 'System.String Microsoft.EntityFrameworkCore.Diagnostics.RelationalStrings.get_NoConnectionOrConnectionString()'

向控制器发起请求时也会出现相同的System.MissingMethodException错误。

使用的是ASP.NET Core 6(无Startup.cs文件),已在Program.cs中添加DbContext注册代码,但问题仍未解决。以下是相关代码与配置:

MySqlContext代码

namespace APILeaderboardProjectCallback.Data
{
public class MySqlContext : DbContext
{
 public DbSet<Level> Levels { get; set; }
 public DbSet<Player> Players { get; set; }
 public DbSet<Try> Tries { get; set; }
 public DbSet<Morality> Moralities { get; set; }
 public DbSet<MoralAction> MoralActions { get; set; }
 public DbSet<MoralActionUsage> MoralActionUsages { get; set; }
 private readonly IConfiguration _configuration;
 
 public MySqlContext(IConfiguration configuration)
 {
        _configuration = configuration;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseMySQL( _configuration.GetConnectionString("db"));
}
}

Program.cs添加的代码

builder.Services.AddDbContext<MySqlContext>(
options => options.UseMySQL(builder.Configuration.GetConnectionString("db"))
);

NuGet包配置(csproj片段)

<ItemGroup>
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.0">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
  <PackageReference Include="MySql.EntityFrameworkCore" Version="6.0.7" />
  <PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
  <PackageReference Include="SQLiteNetExtensions" Version="2.1.0" />
  <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>

appsettings.json连接字符串

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  "ConnectionStrings": {
    "db": "server=callback-leaderboard-db.mysql.database.azure.com;database=callback_leaderboard;user=jauclair4;password=[my password]"
  }
}

请问该错误是否由连接字符串无效导致?如何解决这个问题?


解决方案

这个错误不是直接由连接字符串无效导致,核心原因是EF Core相关包版本不兼容,再加上配置冗余和Azure MySQL特定配置缺失。以下是具体解决步骤:

1. 统一EF Core相关包版本

ASP.NET Core 6对应Entity Framework Core 6版本,你当前使用的Microsoft.EntityFrameworkCore.Tools(7.0.0)和MySql.EntityFrameworkCore(6.0.7)版本不匹配,导致方法找不到的异常。

修改csproj中的包版本,将EF Core相关包统一为6.x稳定版:

<ItemGroup>
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.25">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.1" />
  <PackageReference Include="MySql.EntityFrameworkCore" Version="6.0.7" />
  <PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
  <PackageReference Include="SQLiteNetExtensions" Version="2.1.0" />
  <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>

2. 移除DbContext中的冗余配置

你同时在Program.cs和MySqlContext的OnConfiguring方法中配置了数据库连接,可能导致冲突。保留Program.cs的注册配置,删除MySqlContext中的冗余代码:

namespace APILeaderboardProjectCallback.Data
{
public class MySqlContext : DbContext
{
 public DbSet<Level> Levels { get; set; }
 public DbSet<Player> Players { get; set; }
 public DbSet<Try> Tries { get; set; }
 public DbSet<Morality> Moralities { get; set; }
 public DbSet<MoralAction> MoralActions { get; set; }
 public DbSet<MoralActionUsage> MoralActionUsages { get; set; }
 
 public MySqlContext(DbContextOptions<MySqlContext> options) : base(options)
 {
 }
}

3. 修正Azure MySQL连接字符串

Azure托管的MySQL有两个关键要求:

  • 必须启用SSL,需添加SslMode=Required参数
  • 用户名格式为用户名@服务器名称(你的服务器名称是callback-leaderboard-db)

修改后的连接字符串:

"ConnectionStrings": {
  "db": "server=callback-leaderboard-db.mysql.database.azure.com;database=callback_leaderboard;user=jauclair4@callback-leaderboard-db;password=[my password];SslMode=Required"
}

4. 配置Azure MySQL防火墙

本地开发时,需要在Azure门户的MySQL服务器防火墙设置中,添加当前开发机器的IP地址,否则会被拒绝连接。

5. 清理并重新安装依赖

执行以下命令确保包版本正确:

dotnet clean
dotnet restore

6. 重新生成迁移并更新数据库

删除之前生成的错误迁移文件(如果有),然后重新执行:

Add-Migration InitialCreate
Update-Database

验证

完成以上步骤后,重新启动API,发起控制器请求,应该能正常连接到Azure MySQL数据库。

内容的提问来源于stack exchange,提问作者Pordrack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:01:10