Конфликт типов MySqlParameter при использовании Entity Framework с Pomelo - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть проект DAL.EntityFramework, в котором установлен пакет Pomelo.EntityFrameworkCore.MySql.У меня также есть пакет DAL.MySQL, в котором установлен пакет MySql.Data.Этот второй проект для общих вещей MySQL, который не связан с EntityFramework.

В DAL.EntityFramework у меня есть метод, который использует ADO.NET, чтобы я мог выполнить операцию INSERT ... ON DUPLICATE KEY UPDATE с моей базой данных (котораяиначе недоступно).

public async Task<int> SmartUpsert(UserDetails user)
{
    var dbQuery = this.queryProvider.SmartUpsert(user);

    using (var command = this.Context.Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = dbQuery.Query;
        command.CommandType = System.Data.CommandType.Text;
        command.Parameters.AddRange(dbQuery.Params.ToArray());

        this.Context.Database.OpenConnection();
        command.ExecuteNonQuery();
        this.Context.Database.CloseConnection();

        return Convert.ToInt32(command.Parameters["@Output"].Value.ToString());
    }
}

queryProvider внедряется в класс, а реализация находится в TAP.MySQL.Это используется для предоставления специфичного для провайдера SQL, который необходим без ввода проекта EF конкретному провайдеру SQL.Он также создает коллекцию параметров (поскольку они также зависят от поставщика).

public DbQuery SmartUpsert(UserDetails user)
{
    var query = new DbQuery
    {
        Query = "SmartUpsertUserDetails"
    };

    var sqlParams = new List<MySqlParameter>()
    {
        new MySqlParameter("@id", user.UserId),
        new MySqlParameter("@title", user.Title),
        new MySqlParameter("@name", user.Name),
        new MySqlParameter("@surname", user.Surname),
        new MySqlParameter("@email", user.Email)
    };

    var outputParam = new MySqlParameter();
    outputParam.ParameterName = "@result";
    outputParam.MySqlDbType = MySqlDbType.Int32;
    outputParam.Direction = ParameterDirection.Output;
    sqlParams.Add(outputParam);

    query.Params = sqlParams;

    return query;
}

При запуске этого кода происходит сбой в строке command.Parameters.AddRange(dbQuery.Params.ToArray()); со следующим исключением:

[A] MySql.Data.MySqlClient.MySqlParameter нельзя преобразовать в [B] MySql.Data.MySqlClient.MySqlParameter.Тип A происходит от «MySql.Data, версия = 8.0.13.0, Culture = нейтральный, PublicKeyToken = c5687fc88969c44d» в контексте «По умолчанию» в расположении «C: \ Users \ Andy.nuget \ packages \ mysql.data \ 8.0.13\ Lib \ netcoreapp2.0 \ MySql.Data.dll».Тип B происходит из «MySqlConnector, версия = 0.47.1.0, Culture = нейтральный, PublicKeyToken = d33d3e53aa5f8c92» в контексте «По умолчанию» в расположении «C: \ Users \ Andy.nuget \ packages \ mysqlconnector \ 0.47.1 \ lib \ netcoreapp2.1 \ MySqlConnector.dll '.

Кажется, что возникает путаница между MySqlParameter в пакете MySqlConnector, который поставляется с Pomelo.EntityFrameworkCore.MySql, и MySqlParameter в MySql.Data, установленном в моем проекте DAL.MySQL.

Что мне делать в этом сценарии?Я не совсем уверен, почему Pomelo использует дубликаты существующих классов MySql, но неважно.

1 Ответ

0 голосов
/ 13 декабря 2018

Pomelo использует MySqlConnector вместо собственного пакета Oracle.Преимущества этого описаны на сайте проекта MySqlConnector :

Зачем использовать MySqlConnector поверх Oracle Connector / NET?

MySqlConnector - переопределение чистой комнаты Протокол MySQL и не основан на Соединитель Oracle / NET .

Async

  • MySqlConnector: Полностьюасинхронный ввод / вывод
  • Соединитель Oracle / NET : Асинхронные вызовы сопоставляются с синхронным вводом / выводом

Разработка

  • MySqlConnector: Открытая совместная разработка на GitHub
  • Соединитель Oracle / NET : план закрытых разработок.Код доступен для просмотра на GitHub , некоторые проблемы решены на форумах

Лицензия

Так что, в принципе, MySqlConnector - это просто гораздо лучший выбор.Мой опыт работы с собственными пакетами Oracle также показывает, что они медленно развиваются, и вы, как правило, понятия не имеете, над чем они работают.Например, когда был выпущен EF Core 2.0, провайдер Oracle EF медленно обновлялся, и когда они его выпускали, он не работал должным образом.Но исходный код на GitHub еще не был обновлен, поэтому вы даже не могли сказать, что там происходит.Pomelo и MySqlConnector гораздо более открыты и, как правило, более приятны в использовании.

В соответствии с эта проблема повторное использование тех же пространств имен в MySqlConnector было намеренным выбором в качестве замены для подключения коннектора Oracle.,Использование обоих одновременно не является преднамеренным вариантом использования, хотя возможно сделать так , если у вас действительно нет другого выбора.

Для вашего проекта это означает, что вы должны рассмотретьтакже переходит на MySqlConnector.Таким образом, вы можете легко разрешить конфликты.


Как прокомментировал Брэдли Грейнджер , автор MySqlConnector:

Есть несколько частейAPI MySql.Data, которые не реализованы (MySqlScript может быть самым большим, но он очень редко используется);большинство людей считают, что они на 100% совместимы с использованием MySql.Data.Проверьте документы по миграции здесь: https://mysqlconnector.net/tutorials/migrating-from-connector-net/. Возможно, вам придется изменить некоторые параметры строки подключения, если ваш код использует различные варианты поведения MySql.Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...