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

