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

我有一个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());并出现以下异常:


似乎Pomelo.EntityFrameworkCore.MySql在我的 DAL.MySQL 项目中安装的 MySqlConnector 包中的 MySqlParameter 和 MySql.Data 中的 MySqlParameter 之间感到困惑。


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


largeQ
浏览 192回答 1
1回答

九州编程

Pomelo使用的是MySqlConnector而不是 Oracle 自己的包。MySqlConnector 项目网站概述了这样做的好处:为什么在 Oracle 的 Connector/NET 上使用 MySqlConnector?MySqlConnector 是MySQL 协议的无尘室重新实现,不基于Oracle 的 Connector/NET。异步MySqlConnector:完全异步 I/OOracle 的连接器/NET:异步调用映射到同步 I/O发展MySqlConnector:GitHub 上的开放协作开发Oracle 的连接器/NET:封闭式开发路线图。代码可在GitHub 上查看,一些问题在论坛中解决执照MySqlConnector:麻省理工学院许可证Oracle 的连接器/NET:带有FOSS 异常的GPLv2;或商业许可证所以基本上,MySqlConnector 只是一个更好的选择。我对 Oracle 自己的软件包的体验还在于它们发展缓慢,而且您通常不知道它们在做什么。例如,当 EF Core 2.0 发布时,Oracle 的 EF 提供程序正在缓慢更新,当他们发布它时,它无法正常工作。但是 GitHub 上的源代码还没有更新,所以你甚至无法知道那里发生了什么。Pomelo 和 MySqlConnector 更开放,通常更易于使用。根据这个问题,在 MySqlConnector 中重用相同的命名空间是作为 Oracle 连接器的直接替代品的有意选择。同时使用两者并不是一个有意的用例,尽管如果你真的别无选择,也可以这样做。对于您的项目,这意味着您也应该考虑迁移到 MySqlConnector。这样,您可以轻松解决冲突。正如MySqlConnector 的作者Bradley Grainger所说:MySql.Data API 有几个部分没有实现(MySqlScript 可能是最大的,但很少使用);大多数人发现它与他们对 MySql.Data 的使用 100% 兼容。在此处查看迁移文档:https&nbsp;://mysqlconnector.net/tutorials/migrating-from-connector-net/ 。如果您的代码依赖于各种 MySql.Data 行为,您可能需要更改一些连接字符串设置。
打开App,查看更多内容
随时随地看视频慕课网APP