首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Pomelo一起使用实体框架时MySqlParameter类型冲突

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

Stack Overflow用户
提问于 2018-12-13 10:26:24
回答 1查看 1.7K关注 0票数 2

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

在DAL.EntityFramework中,我有一个使用ADO.NET的方法,这样我就可以对我的数据库执行INSERT ... ON DUPLICATE KEY UPDATE操作(否则无法使用)。

代码语言:javascript
复制
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项目。它还创建参数集合(因为它们也是特定于提供程序的)。

代码语言:javascript
复制
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());行上失败:

不能将AMySql.Data.MySqlClient.MySqlParameter转换为BMySql.Data.MySqlClient.MySqlParameter。类型A来源于位于location 'C:\Users\Andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\MySql.Data.dll'.的上下文中的“MySql.Data、Version=8.0.13.0、Culture=neutral、PublicKeyToken=c5687fc88969c44d”B类型源自位于location 'C:\Users\Andy.nuget\packages\mysqlconnector\0.47.1\lib\netcoreapp2.1\MySqlConnector.dll'.的上下文中的“MySqlConnector、Version=0.47.1.0、Culture=neutral、PublicKeyToken=d33d3e53aa5f8c92”

在安装在我的MySqlParameter项目中的MySqlConnector包中的Pomelo.EntityFrameworkCore.MySql包和安装在MySql.Data中的MySqlParameter之间,似乎有点混淆了。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-13 11:45:28

柚子使用的是MySqlConnector,而不是自己的软件包。MySqlConnector项目场地概述了这方面的好处。

为什么在甲骨文的连接器/网络上使用MySqlConnector? MySqlConnector是MySQL协议的一个洁净室重新实现,而不是基于Oracle的连接器/网。 异步

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

开发

  • MySqlConnector:开放与GitHub协同开发
  • 甲骨文的连接器/网络:封闭的开发路线图。代码可以在GitHub上查看,有些问题是用论坛解决的

许可证

  • MySqlConnector:麻省理工学院许可证
  • 甲骨文的连接器/网络GPLv2自由和开放源码软件例外;或商业许可证

因此,基本上,MySqlConnector只是一个更好的选择。我对Oracle自己的包的经验也是,它们发展缓慢,而且您通常不知道它们在做什么。例如,当EFCore2.0发布时,Oracle的EF提供者正在缓慢更新,当他们发布它时,它没有正常工作。但是GitHub上的源代码还没有更新,所以你甚至无法知道那里发生了什么。柚子和MySqlConnector是更开放和一般更好的使用。

按照本期的说法,在MySqlConnector中重用相同的名称空间是一种有意的选择,可以作为Oracle连接器的替代。同时使用这两种方法并不是有意的用例,尽管如果您真的没有其他选择的话,它是是有可能做到的的。

对于您的项目,这意味着您也应该考虑迁移到MySqlConnector。这样,你就可以很容易地解决冲突。

正如布拉德利·格兰杰所评论的,MySqlConnector的作者:

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53759714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档