Dapper.Contrib与MiniProfiler(MySQL版)集成问题求助
解决MiniProfiler + Dapper.Contrib + MySQL的SQL语法兼容问题
这个问题的核心是**ProfiledDbConnection没有正确告知Dapper.Contrib它底层是MySQL连接**,导致Dapper.Contrib误判为SQL Server,生成了带方括号[]的SQL语法,而MySQL需要的是反引号`。
解决方案:自定义适配MySQL的ProfiledDbConnection
我们需要创建一个ProfiledDbConnection的子类,显式返回MySQL的DbProviderFactory,让Dapper.Contrib能正确识别数据库类型:
public class ProfiledMySqlConnection : ProfiledDbConnection { public ProfiledMySqlConnection(DbConnection connection, IDbProfiler profiler) : base(connection, profiler) { } // 重写DbProviderFactory,返回底层MySQL连接的工厂 protected override DbProviderFactory DbProviderFactory => MySqlConnector.MySqlConnectorFactory.Instance; }
注意:如果你用的是
MySql.Data.MySqlClient而不是MySqlConnector,这里要换成MySql.Data.MySqlClient.MySqlClientFactory.Instance
修改ConnectionFactory的GetConnection方法
把原来返回ProfiledDbConnection的代码改成返回我们自定义的ProfiledMySqlConnection:
public IDbConnection GetConnection() { var connection = new MySqlConnection(_connectionString); return new ProfiledMySqlConnection(connection, CustomDbProfiler.Current); }
验证修复效果
现在调用InsertAsync时,Dapper.Contrib会正确识别这是MySQL连接,生成带反引号的SQL:
INSERT INTO `YourTableName` (`Id`, `CreatedAt`, `AndSoOn`) VALUES (...)
而不是之前错误的SQL Server风格语法。
额外注意事项
- 确保你的
CustomDbProfiler是全局可用且正确初始化的,MiniProfiler需要它来收集性能数据 - 如果你后续使用Dapper的其他Contrib方法(比如
UpdateAsync、DeleteAsync),这个自定义连接也能正常适配,不会再出现语法问题
内容的提问来源于stack exchange,提问作者Mykola Klymyuk
相关产品推荐
相关产品推荐

