#事故现场
- 使用.net core ef 连接mysql,进行查询操作,报错如下:
The LINQ expression ‘DbSet<Ps_Path>()
.Where(p => p.Mark.Equals(
value: __Substring_0,
comparisonType: OrdinalIgnoreCase))’ could not be translated. Additional information: Translation of the ‘String.Equals’ overload with a ‘StringComparison’ parameter is not supported by default. To opt-in to translations of methods with a ‘StringComparison’ parameter, callEnableStringComparisonTranslations
on your MySQL specific ‘DbContext’ options. For general EF Core information about this error, see https://go.microsoft.com/fwlink/?linkid=2129535 for more information. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to ‘AsEnumerable’, ‘AsAsyncEnumerable’, ‘ToList’, or ‘ToListAsync’. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
- 开发环境:
.net core : .NET 5
mysql : 8.0.25
mysqlclient包:Pomelo.EntityFrameworkCore.MySql,版本: 5.0
#原因
报错代码:
var path = db.Ps_Path.FirstOrDefault(s =>
s.Mark.Equals(fileInfo.RelativePath.Substring(0, 3), StringComparison.OrdinalIgnoreCase));
上面代码使用了比较字符串的StringComparison.OrdinalIgnoreCase参数,Pomelo.EntityFrameworkCore.MySql
默认不支持,需要配置DbContext;
#解决方法
配置DbContext的EnableStringComparisonTranslations
属性;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var serverVersion = new MySqlServerVersion(new Version(8, 0, 25));
optionsBuilder.UseMySql(_configuration.GetConnectionString("mysql"), serverVersion, mySqlOptions => mySqlOptions.EnableStringComparisonTranslations(true));
}