Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实体框架与Pomelo一起使用时,MySqlParameter类型冲突_C#_Mysql_Asp.net_Entity Framework_Asp.net Core - Fatal编程技术网

C# 将实体框架与Pomelo一起使用时,MySqlParameter类型冲突

C# 将实体框架与Pomelo一起使用时,MySqlParameter类型冲突,c#,mysql,asp.net,entity-framework,asp.net-core,C#,Mysql,Asp.net,Entity Framework,Asp.net Core,我有一个DAL.EntityFramework项目,它安装了Pomelo.EntityFrameworkCore.MySql包。我还有一个DAL.MySQL包,其中安装了MySQL.Data包。第二个项目是针对与EntityFramework无关的一般MySQL内容的 在DAL.EntityFramework中,我有一个使用ADO.NET的方法,这样我就可以执行插入。。。在对我的数据库执行重复密钥更新时操作(否则不可用) 运行此代码时,命令.Parameters.AddRange(dbQuery

我有一个DAL.EntityFramework项目,它安装了
Pomelo.EntityFrameworkCore.MySql
包。我还有一个DAL.MySQL包,其中安装了MySQL.Data包。第二个项目是针对与EntityFramework无关的一般MySQL内容的

在DAL.EntityFramework中,我有一个使用ADO.NET的方法,这样我就可以执行
插入。。。在对我的数据库执行重复密钥更新时
操作(否则不可用)

运行此代码时,
命令.Parameters.AddRange(dbQuery.Params.ToArray())失败行,但出现以下异常:

[A] MySql.Data.MySqlClient.MySqlParameter无法强制转换为 [B] MySql.Data.MySqlClient.MySqlParameter。A型起源于 'MySql.Data,版本=8.0.13.0,区域性=neutral, PublicKeyToken=c5687fc88969c44d,位于位置的上下文“默认值” 'C:\Users\Andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\mysql.data.dll'。 类型B源自“MySqlConnector,版本=0.47.1.0, 区域性=中性,PublicKeyToken=上下文中的d33d3e53aa5f8c92 位置处的“默认值” 'C:\Users\Andy.nuget\packages\mysqlconnector\0.47.1\lib\netcoreapp2.1\mysqlconnector.dll'

似乎是把
Pomelo.EntityFrameworkCore.MySql
附带的MySqlConnector包中的MySqlParameter和mydal.MySql项目中安装的MySql.Data中的MySqlParameter搞混了

在这种情况下我该怎么办?我不完全清楚为什么Pomelo使用的是现有MySql类的副本,但无论如何。

使用的是Oracle自己的包。以下内容概述了这一方法的好处:

为什么在Oracle的Connector/NET上使用MySqlConnector? MySqlConnector是的无尘室重新实现,而不是基于

异步的
  • MySqlConnector:完全异步I/O
  • Oracle的连接器/NET:异步调用映射到同步I/O
发展
  • MySqlConnector:
  • Oracle的Connector/NET:封闭式发展路线图。代码在上可见,一些问题在中解决
许可证
  • MySqlConnector:麻省理工学院许可证
  • Oracle的连接器/网络:带有;或
所以基本上,MySqlConnector是一个更好的选择。我对Oracle自己的软件包的经验是,它们的发展速度很慢,您通常不知道它们在做什么。例如,当EF Core 2.0发布时,Oracle的EF提供程序正在缓慢更新,当他们发布时,它无法正常工作。但是GitHub上的源代码还没有更新,所以你甚至无法知道那里发生了什么。Pomelo和MySqlConnector更开放,通常使用起来更好

据介绍,在MySqlConnector中重用相同的名称空间是作为Oracle连接器替代品的一个慎重选择。同时使用这两者并不是有意的用例,尽管如果您真的没有其他选择的话,这是非常有用的

对于你的项目,这意味着你也应该考虑搬到MySqlConnector。这样,您可以轻松解决冲突


正如MySqlConnector的作者所评论的:

MySql.Data API有几个部分没有实现(MySqlScript可能是最大的部分,但很少使用);大多数人发现它与MySql.Data的使用完全兼容。检查此处的迁移文档:。如果代码依赖于各种MySql.Data行为,则可能需要更改某些连接字符串设置


太好了,谢谢你。我曾考虑在全球范围内切换到
MySqlConnector
,但不确定它是否能与
MySql.Data
完全交换,即它是否能拥有
MySql.Data
所拥有的一切。这听起来像是一个完整的重新实现,并且是最新的(通过查看GitHub页面),所以我想我将尝试继续用
MySqlConnector
替换
MySql.Data
。正如预期的那样,这解决了我的问题。再次感谢你的帮助@我是MySqlConnector的作者。MySql.Data API有几个部分没有实现(
MySqlScript
可能是最大的部分,但很少使用);大多数人发现它与MySql.Data的使用完全兼容。检查此处的迁移文档:。如果您的代码依赖于各种MySql.Data行为,则可能需要更改某些连接字符串设置。@BradleyGrainger感谢您的帮助!我已经把它复制到我的答案中,以确保它足够清晰和持久:)谢谢@BradleyGrainger。我看到了那个页面,没有发现任何会引起我任何问题的东西。我真的很感谢你们的个人帮助!
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());
    }
}
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;
}