【问题标题】:MySqlParameter type conflict when using Entity Framework with Pomelo将实体框架与 Pomelo 一起使用时 MySqlParameter 类型冲突
【发布时间】: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


    【解决方案1】:

    Pomelo 正在使用 MySqlConnector 而不是 Oracle 自己的包。 MySqlConnector project site 上概述了这样做的好处:

    为什么在 Oracle 的 Connector/NET 上使用 MySqlConnector?

    MySqlConnector 是 MySQL Protocol 的无尘室重新实现,并非基于 Oracle’s Connector/NET

    异步

    • MySqlConnector: 完全异步 I/O
    • Oracle 的连接器/NET:异步调用映射到同步 I/O

    发展

    • MySqlConnector:GitHub 上进行开放式协作开发
    • Oracle 的连接器/NET:封闭式开发路线图。代码可在GitHub 上查看,一些问题在forums 中解决

    许可证

    所以基本上,MySqlConnector 只是一个更好的选择。我对 Oracle 自己的软件包的体验还在于它们发展缓慢,而且您通常不知道它们在做什么。例如,当 EF Core 2.0 发布时,Oracle 的 EF 提供程序正在缓慢更新,当他们发布它时,它无法正常工作。但是 GitHub 上的源代码还没有更新,所以你甚至无法知道那里发生了什么。 Pomelo 和 MySqlConnector 更开放,通常更易于使用。

    根据this issue,在 MySqlConnector 中重用相同的命名空间是作为 Oracle 连接器的直接替代品的有意选择。同时使用两者并不是故意的用例,尽管如果你真的别无选择,它is possible to do so

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


    MySqlConnector 的作者Bradley Grainger 评论:

    MySql.Data API 有几个部分没有实现(MySqlScript 可能是最大的,但很少使用);大多数人发现它与他们对 MySql.Data 的使用 100% 兼容。在此处查看迁移文档:https://mysqlconnector.net/tutorials/migrating-from-connector-net/。如果您的代码依赖于各种 MySql.Data 行为,您可能需要更改一些连接字符串设置。

    【讨论】:

    • 太好了,谢谢戳。我曾考虑在全球范围内切换到MySqlConnector,但不确定它是否可以与MySql.Data 完全互换,即它是否具有MySql.Data 所拥有的一切。听起来这是一个完整的重新实现并且保持最新(从查看 GitHub 页面)所以我想我会尝试用MySqlConnector 替换MySql.Data
    • 正如预期的那样,这解决了我的问题。再次感谢您的帮助!
    • @AndyFurniss 我是 MySqlConnector 的作者。 MySql.Data API 有几个部分没有实现(MySqlScript 可能是最大的部分,但很少使用);大多数人发现它与他们对 MySql.Data 的使用 100% 兼容。在此处查看迁移文档:mysql-net.github.io/MySqlConnector/tutorials/…。如果您的代码依赖于各种 MySql.Data 行为,您可能需要更改一些连接字符串设置。
    • @BradleyGrainger 感谢您提供的额外见解!我已将其复制到我的答案中,以确保它足够可见和持久:)
    • 感谢@BradleyGrainger。我看过那个页面,没有发现任何会导致我出现任何问题的东西。我非常感谢你们在这方面的个人帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多