为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
largeQ 2022-06-12 11:14:46
我有一个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 类的副本,但无论如何。
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

Pomelo使用的是MySqlConnector而不是 Oracle 自己的包。MySqlConnector 项目网站概述了这样做的好处:

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

MySqlConnector 是MySQL 协议的无尘室重新实现,不基于Oracle 的 Connector/NET

异步

  • MySqlConnector:完全异步 I/O

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

发展

执照

所以基本上,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 ://mysqlconnector.net/tutorials/migrating-from-connector-net/ 。如果您的代码依赖于各种 MySql.Data 行为,您可能需要更改一些连接字符串设置。


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信