将Pomelo实体框架与MySqlParameter类型冲突

时间:2018-12-13 10:26:24

标签: c# mysql asp.net entity-framework asp.net-core

我有一个DAL.EntityFramework项目,该项目安装了Pomelo.EntityFrameworkCore.MySql软件包。我也有一个DAL.MySQL软件包,其中安装了MySql.Data软件包。第二个项目是针对与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,版本= 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与DAL.MySQL项目中安装的MySql.Data中的MySqlParameter混淆了。

在这种情况下我该怎么办?我不完全确定为什么Pomelo使用现有MySql类的重复项,但不管怎样。

1 个答案:

答案 0 :(得分:3)

Pomelo使用的是MySqlConnector,而不是Oracle自己的软件包。 MySqlConnector project site概述了其好处:

  

为什么通过Oracle的Connector / NET使用MySqlConnector?

     

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

     

异步

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

发展

     
      
  • MySqlConnector:GitHub上进行开放式协作开发
  •   
  • Oracle的Connector / 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://mysql-net.github.io/MySqlConnector/tutorials/migrating-from-connector-net/。如果您的代码依赖于各种MySql.Data行为,则可能需要更改一些连接字符串设置。