我有一个dal.entityframework项目 Pomelo.EntityFrameworkCore.MySql
已安装程序包。我还有一个dal.mysql包,它安装了mysql.data包。第二个项目是针对一般mysql的东西,它与entityframework无关。
在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,而无需向特定sql提供程序键入ef项目。它还创建参数集合(因为它们也是特定于提供程序的)。
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源于“c:\users\andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\mysql.data.dll”上下文“default”中的“mysql.data,version=8.0.13.0,culture=neutral,publickeytoken=c5687fc88969c44d”。类型b源于“c:\users\andy.nuget\packages\mysqlconnector\0.47.1\lib\netcoreapp2.1\mysqlconnector.dll”上下文“default”中的“mysqlconnector,version=0.47.1.0,culture=neutral,publickeytoken=d33d3e53aa5f8c92”。
似乎在mysqlconnector包中的mysqlparameter与 `Pomelo.EntityFrameworkCore.MySql` 以及mysql.data中的mysqlparameter,安装在我的dal.mysql项目上。
在这种情况下我该怎么办?我不太清楚为什么pomero会使用现有mysql类的副本,但不管怎样。
1条答案
按热度按时间eni9jsuy1#
pomelo使用mysqlconnector而不是oracle自己的包。mysqlconnector项目网站概述了这一点的好处:
为什么在oracle的connector/net上使用mysqlconnector?
mysqlconnector是mysql协议的一个净室重新实现,它不是基于oracle的connector/net。
异步
mysqlconnector:完全异步i/o
oracle的connector/net:异步调用Map到同步i/o
发展
mysqlconnector:github上的开放协作开发
oracle的connector/net:封闭式开发路线图。代码可以在github上查看,一些问题可以在论坛上解决
许可证
mysqlconnector:mit许可证
oracle的connector/net:gplv2,foss异常;或商业许可证
所以基本上,mysqlconnector只是一个更好的选择。我对oracle自己的软件包的经验是,它们的发展速度很慢,而且您通常不知道它们在做什么。例如,当efcore2.0发布时,oracle的ef提供者正在缓慢地更新,当他们发布时,它不能正常工作。但是github上的源代码还没有更新,所以你甚至不知道那里发生了什么。柚子和mysqlconnector更开放,通常使用起来更好。
根据这个问题,在mysqlconnector中重用相同的名称空间是一个深思熟虑的选择,可以替代oracle的连接器。同时使用两者并不是有意的用例,尽管如果您真的没有其他选择的话,也可以这样做。
对于您的项目,这意味着您还应该考虑迁移到mysqlconnector。这样,您可以轻松解决冲突。
正如mysqlconnector的作者bradley grainger所说:
mysql.data api有几个部分没有实现(mysqlscript可能是最大的一个,但很少使用);大多数人发现它与mysql.data的使用完全兼容。请在此处查看迁移文档:https://mysqlconnector.net/tutorials/migrating-from-connector-net/. 如果代码依赖于各种mysql.data行为,则可能需要更改某些连接字符串设置。