C# 将实体框架与Pomelo一起使用时,MySqlParameter类型冲突
我有一个DAL.EntityFramework项目,它安装了C# 将实体框架与Pomelo一起使用时,MySqlParameter类型冲突,c#,mysql,asp.net,entity-framework,asp.net-core,C#,Mysql,Asp.net,Entity Framework,Asp.net Core,我有一个DAL.EntityFramework项目,它安装了Pomelo.EntityFrameworkCore.MySql包。我还有一个DAL.MySQL包,其中安装了MySQL.Data包。第二个项目是针对与EntityFramework无关的一般MySQL内容的 在DAL.EntityFramework中,我有一个使用ADO.NET的方法,这样我就可以执行插入。。。在对我的数据库执行重复密钥更新时操作(否则不可用) 运行此代码时,命令.Parameters.AddRange(dbQuery
Pomelo.EntityFrameworkCore.MySql
包。我还有一个DAL.MySQL包,其中安装了MySQL.Data包。第二个项目是针对与EntityFramework无关的一般MySQL内容的
在DAL.EntityFramework中,我有一个使用ADO.NET的方法,这样我就可以执行插入。。。在对我的数据库执行重复密钥更新时
操作(否则不可用)
运行此代码时,命令.Parameters.AddRange(dbQuery.Params.ToArray())失败代码>行,但出现以下异常:
[A] MySql.Data.MySqlClient.MySqlParameter无法强制转换为
[B] MySql.Data.MySqlClient.MySqlParameter。A型起源于
'MySql.Data,版本=8.0.13.0,区域性=neutral,
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和mydal.MySql项目中安装的MySql.Data中的MySqlParameter搞混了
在这种情况下我该怎么办?我不完全清楚为什么Pomelo使用的是现有MySql类的副本,但无论如何。使用的是Oracle自己的包。以下内容概述了这一方法的好处:
为什么在Oracle的Connector/NET上使用MySqlConnector?
MySqlConnector是的无尘室重新实现,而不是基于
异步的
- MySqlConnector:完全异步I/O
- Oracle的连接器/NET:异步调用映射到同步I/O
发展
- MySqlConnector:
- Oracle的Connector/NET:封闭式发展路线图。代码在上可见,一些问题在中解决
许可证
- MySqlConnector:麻省理工学院许可证
- Oracle的连接器/网络:带有;或
所以基本上,MySqlConnector是一个更好的选择。我对Oracle自己的软件包的经验是,它们的发展速度很慢,您通常不知道它们在做什么。例如,当EF Core 2.0发布时,Oracle的EF提供程序正在缓慢更新,当他们发布时,它无法正常工作。但是GitHub上的源代码还没有更新,所以你甚至无法知道那里发生了什么。Pomelo和MySqlConnector更开放,通常使用起来更好
据介绍,在MySqlConnector中重用相同的名称空间是作为Oracle连接器替代品的一个慎重选择。同时使用这两者并不是有意的用例,尽管如果您真的没有其他选择的话,这是非常有用的
对于你的项目,这意味着你也应该考虑搬到MySqlConnector。这样,您可以轻松解决冲突
正如MySqlConnector的作者所评论的:
MySql.Data API有几个部分没有实现(MySqlScript可能是最大的部分,但很少使用);大多数人发现它与MySql.Data的使用完全兼容。检查此处的迁移文档:。如果代码依赖于各种MySql.Data行为,则可能需要更改某些连接字符串设置
太好了,谢谢你。我曾考虑在全球范围内切换到MySqlConnector
,但不确定它是否能与MySql.Data
完全交换,即它是否能拥有MySql.Data
所拥有的一切。这听起来像是一个完整的重新实现,并且是最新的(通过查看GitHub页面),所以我想我将尝试继续用MySqlConnector
替换MySql.Data
。正如预期的那样,这解决了我的问题。再次感谢你的帮助@我是MySqlConnector的作者。MySql.Data API有几个部分没有实现(MySqlScript
可能是最大的部分,但很少使用);大多数人发现它与MySql.Data的使用完全兼容。检查此处的迁移文档:。如果您的代码依赖于各种MySql.Data行为,则可能需要更改某些连接字符串设置。@BradleyGrainger感谢您的帮助!我已经把它复制到我的答案中,以确保它足够清晰和持久:)谢谢@BradleyGrainger。我看到了那个页面,没有发现任何会引起我任何问题的东西。我真的很感谢你们的个人帮助!
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());
}
}
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;
}