Проблемы интеграции Dapper.Contrib и MiniProfiler (для MySql)
Я пытаюсь использовать MiniProfiler.Integrations.MySql вместе с расширениями Dapper.Contrib для профилирования запросов sql, отправленных на сервер MySql. Я использую свою собственную ConnectionFactory:
public IDbConnection GetConnection()
{
var connection = (DbConnection) new MySqlConnection(_connectionString);
return new ProfiledDbConnection(connection, CustomDbProfiler.Current);
}
Dapper.Contrib позволяет вставлять новые записи так же просто, как
public async Task AddAsync(TEntity sample)
{
using (var connection = _connectionFactory.GetConnection())
{
await connection.InsertAsync(sample);
}
}
Но ProfiledDbConnection
интерпретируется как SQLConnection
создавая синтаксис SQLServer, который несовместим с MySQL:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[Id], [CreatedAt], [AndSoOn]' at line 1
Нужны ваши советы о том, как решить проблему и заставить MiniProfiler работать.
Я использую (все из Nuget):
Dapper: 1,50,5
Dapper.Contrib: 1.50.5
MiniProfiler: 3.2.0
MiniProfiler.Integrations.MySql: 1.0.1
2 ответа
Как обходной путь, в текущей версии вы можете переопределить разрешение имен на основе типов в Dapper.Contrib следующим образом:
SqlMapperExtensions.GetDatabaseType = conn => "MySqlConnection";
Это заменит значение по умолчанию connection.GetType()
поведение на основе имени. Тем не менее, это не удивительно, и я посмотрю, сможем ли мы улучшить это в следующем выпуске Dapper.
Похоже, я нашел обходной путь для Insert()
а также InsertAsync()
методы, они принимают ISqlAdapter в качестве необязательного параметра, который, кажется, решает проблему (но все же я не могу использовать этот подход для Update()
/UpdateAsync()
). Это связано с тем, что когда вы хотите использовать MiniProfiler
с MySQL
а также Dapper.Contrib
вам нужно обернуть MySqlConnection
что приводит к Dapper.Contrib
использование по умолчанию (неправильно) ISqlAdapter
,