【发布时间】:2019-05-14 13:02:29
【问题描述】:
我有一个安装了 Pomelo.EntityFrameworkCore.MySql 包的 DAL.EntityFramework 项目。我还有一个安装了 MySql.Data 包的 DAL.MySQL 包。第二个项目是针对与 EntityFramework 无关的一般 MySQL 内容。
在 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,文化=中性, PublicKeyToken=c5687fc88969c44d' 在上下文“默认”位置 'C:\Users\Andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\MySql.Data.dll'。 B 型源自 'MySqlConnector, Version=0.47.1.0, Culture=neutral, PublicKeyToken=d33d3e53aa5f8c92' 在上下文中 位置的“默认” 'C:\Users\Andy.nuget\packages\mysqlconnector\0.47.1\lib\netcoreapp2.1\MySqlConnector.dll'。
似乎Pomelo.EntityFrameworkCore.MySql附带的MySqlConnector包中的MySqlParameter和我的DAL.MySQL项目上安装的MySql.Data中的MySqlParameter混淆了。
在这种情况下我该怎么办?我不完全确定为什么 Pomelo 使用现有 MySql 类的副本,但无论如何。
【问题讨论】:
标签: c# mysql asp.net entity-framework asp.net-core