У меня есть проект 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, но неважно.