mysqlparameter类型冲突

aelbi1ox  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(428)

我有一个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,而无需向特定sql提供程序键入ef项目。它还创建参数集合(因为它们也是特定于提供程序的)。

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源于“c:\users\andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\mysql.data.dll”上下文“default”中的“mysql.data,version=8.0.13.0,culture=neutral,publickeytoken=c5687fc88969c44d”。类型b源于“c:\users\andy.nuget\packages\mysqlconnector\0.47.1\lib\netcoreapp2.1\mysqlconnector.dll”上下文“default”中的“mysqlconnector,version=0.47.1.0,culture=neutral,publickeytoken=d33d3e53aa5f8c92”。
似乎在mysqlconnector包中的mysqlparameter与 `Pomelo.EntityFrameworkCore.MySql` 以及mysql.data中的mysqlparameter,安装在我的dal.mysql项目上。
在这种情况下我该怎么办?我不太清楚为什么pomero会使用现有mysql类的副本,但不管怎样。
eni9jsuy

eni9jsuy1#

pomelo使用mysqlconnector而不是oracle自己的包。mysqlconnector项目网站概述了这一点的好处:

为什么在oracle的connector/net上使用mysqlconnector?

mysqlconnector是mysql协议的一个净室重新实现,它不是基于oracle的connector/net。

异步

mysqlconnector:完全异步i/o
oracle的connector/net:异步调用Map到同步i/o

发展

mysqlconnector:github上的开放协作开发
oracle的connector/net:封闭式开发路线图。代码可以在github上查看,一些问题可以在论坛上解决

许可证

mysqlconnector:mit许可证
oracle的connector/net:gplv2,foss异常;或商业许可证
所以基本上,mysqlconnector只是一个更好的选择。我对oracle自己的软件包的经验是,它们的发展速度很慢,而且您通常不知道它们在做什么。例如,当efcore2.0发布时,oracle的ef提供者正在缓慢地更新,当他们发布时,它不能正常工作。但是github上的源代码还没有更新,所以你甚至不知道那里发生了什么。柚子和mysqlconnector更开放,通常使用起来更好。
根据这个问题,在mysqlconnector中重用相同的名称空间是一个深思熟虑的选择,可以替代oracle的连接器。同时使用两者并不是有意的用例,尽管如果您真的没有其他选择的话,也可以这样做。
对于您的项目,这意味着您还应该考虑迁移到mysqlconnector。这样,您可以轻松解决冲突。
正如mysqlconnector的作者bradley grainger所说:
mysql.data api有几个部分没有实现(mysqlscript可能是最大的一个,但很少使用);大多数人发现它与mysql.data的使用完全兼容。请在此处查看迁移文档:https://mysqlconnector.net/tutorials/migrating-from-connector-net/. 如果代码依赖于各种mysql.data行为,则可能需要更改某些连接字符串设置。

相关问题