我有一个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类的重复项,但不管怎样。
答案 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: MIT许可证
- Oracle的Connector / NET :GPLv2与FOSS Exception;或commercial license
因此,基本上,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行为,则可能需要更改一些连接字符串设置。