MySQL 在使用Entity Framework Core连接MySQL时遇到的一个常见问题:Cannot convert from ‘string’ to ‘Microsoft.EntityFrameworkCore.ServerVersion’

MySQL 在使用Entity Framework Core连接MySQL时遇到的一个常见问题:Cannot convert from ‘string’ to ‘Microsoft.EntityFrameworkCore.ServerVersion’

在本文中,我们将介绍在使用Entity Framework Core连接MySQL时遇到的一个常见问题:Cannot convert from ‘string’ to ‘Microsoft.EntityFrameworkCore.ServerVersion’。我们将讨论此错误的原因以及如何解决它。

阅读更多:MySQL 教程

问题描述

当使用Entity Framework Core连接MySQL数据库时,可能会遇到以下错误消息:

System.ArgumentException: 'Cannot convert from 'string' to 'Microsoft.EntityFrameworkCore.ServerVersion''

这意味着我们在构建DbContext时指定了错误的版本字符串,从而导致系统无法将其转换为有效的Microsoft.EntityFrameworkCore.ServerVersion对象。

例如,以下代码会触发上述错误:

var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseMySQL(connectionString, 
                        new MySqlServerVersion("5.7.32")); // 错误的版本字符串
var context = new MyContext(optionsBuilder.Options);

原因分析

造成这个错误的原因是我们在使用MySQL时传递了一个错误的版本字符串。正确的版本字符串应该是可以被Microsoft.EntityFrameworkCore.ServerVersion对象解析的字符串。

MySQL 5.7及更高版本中,可以使用以下版本字符串:

  • 5.7.12
  • 5.7.21
  • 5.7.28
  • 8.0.11
  • 8.0.16
  • 8.0.19

请注意,这些字符串不包含“mysql”或“mariadb”前缀。如果你使用的是MariaDB,你需要使用类似于以下的字符串:

  • 10.2.28
  • 10.5.1

解决方案

为了解决这个问题,我们需要使用正确的版本字符串。这可以通过以下几种方式来实现。

使用常量

我们可以在代码中定义一个常量,将版本字符串放置在其中。这样,我们就可以确保传递给MySqlServerVersion方法的版本字符串始终是正确的。

public static class Consts
{
    public const string MySqlVersionString = "5.7.32"; // 正确的版本字符串
}

// 在DbContext配置中使用常量
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseMySQL(connectionString, 
                        new MySqlServerVersion(Consts.MySqlVersionString));
var context = new MyContext(optionsBuilder.Options);

使用appsettings.json

我们可以将版本字符串放置在我们应用程序的配置文件appsettings.json中。这样,我们可以随时更改版本字符串,而不需要更改代码。

首先,我们需要将Microsoft.Extensions.Configuration.Json包添加到我们的项目中。然后,在startup.cs文件中,我们需要注册配置文件并使用它来获取版本字符串。

public class Startup
{
    private IConfiguration Configuration { get; }
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public void ConfigureServices(IServiceCollection services)
    {
        // 注册配置文件
        services.Configure<MySqlOptions>(Configuration.GetSection("MySql"));
        // 获取版本字符串
        var mySqlOptions = Configuration.GetSection("MySql").Get<MySqlOptions>();
        var mysqlServerVersion = new MySqlServerVersion(mySqlOptions.Version);
        // 注册DbContext
        services.AddDbContext<MyContext>(options =>
            options.UseMySQL(Configuration.GetConnectionString("MyContext"), mysqlServerVersion)
        );
    }
}

// appsettings.json文件
{
  "MySql": {
    "Version": "5.7.32"
  },
  "ConnectionStrings": {
    "MyContext": "server=localhost;port=3306;database=mydatabase;uid=root;password=mypassword;"
  }
}

直接使用字符串

如果我们仅需要使用一次MySQL连接,我们可以直接将版本字符串传递给MySqlServerVersion方法。

var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseMySQL(connectionString, 
                        new MySqlServerVersion("5.7.32")); // 正确的版本字符串
var context = new MyContext(optionsBuilder.Options);

总结

在本文中,我们了解了在使用Entity Framework Core连接MySQL时遇到的一个常见问题:Cannot convert from ‘string’ to ‘Microsoft.EntityFrameworkCore.ServerVersion’。我们探讨了此错误的原因以及解决方案,包括使用常量、使用appsettings.json和直接使用字符串。这些解决方案都可以确保我们传递给MySqlServerVersion方法的版本字符串是有效的,并且可以成功连接MySQL数据库。如果你遇到类似的问题,请尝试使用上述解决方案来解决它。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程