gpt4 book ai didi

c# - 将 Entity Framework 与 Pomelo 一起使用时 MySqlParameter 类型冲突

转载 作者:行者123 更新时间:2023-11-29 04:33:06 25 4
gpt4 key购买 nike

我有一个 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 被注入(inject)到类中,并且实现在 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 cannot be cast to [B]MySql.Data.MySqlClient.MySqlParameter. Type A originates from 'MySql.Data, Version=8.0.13.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' in the context 'Default' at location 'C:\Users\Andy.nuget\packages\mysql.data\8.0.13\lib\netcoreapp2.0\MySql.Data.dll'. Type B originates from 'MySqlConnector, Version=0.47.1.0, Culture=neutral, PublicKeyToken=d33d3e53aa5f8c92' in the context 'Default' at location '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 类的重复项,但无论如何。

最佳答案

Pomelo正在使用 MySqlConnector而不是 Oracle 自己的包。 MySqlConnector project site 中概述了这样做的好处:

Why use MySqlConnector over Oracle’s Connector/NET?

MySqlConnector is a clean-room reimplementation of the MySQL Protocol and is not based on Oracle’s Connector/NET.

Async

  • MySqlConnector: Fully asynchronous I/O
  • Oracle’s Connector/NET: Async calls map to synchronous I/O

Development

  • MySqlConnector: Open and Collaborative Development on GitHub
  • Oracle’s Connector/NET: Closed Development Roadmap. Code is viewable on GitHub, some issues addressed in forums

License

所以基本上,MySqlConnector 是一个更好的选择。我对 Oracle 自己的软件包的经验还表明,它们发展缓慢,而且您通常不知道它们在做什么。例如,当 EF Core 2.0 发布时,Oracle 的 EF 提供程序正在缓慢更新,当他们发布它时,它无法正常工作。但GitHub上的源代码还没有更新,所以你根本不知道那里发生了什么。 Pomelo 和 MySqlConnector 更加开放,通常也更好用。

根据 this issue在 MySqlConnector 中重用相同的命名空间是一个有意的选择,旨在作为 Oracle 连接器的直接替代品。同时使用两者并不是有意的用例,尽管它 is possible to do so如果你真的别无选择。

对于您的项目,这意味着您还应该考虑迁移到 MySqlConnector。这样,您就可以轻松解决冲突。


正如 Bradley Grainger 评论的,MySqlConnector的作者:

There are a few parts of the MySql.Data API that aren't implemented (MySqlScript may be the biggest one, but it's very rarely used); most people find that it's 100% compatible with their use of MySql.Data. Check the migration docs here: https://mysqlconnector.net/tutorials/migrating-from-connector-net/. You may need to change some connection string settings if your code relied on various MySql.Data behaviours.

关于c# - 将 Entity Framework 与 Pomelo 一起使用时 MySqlParameter 类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com