Как вызвать хранимую процедуру в Entity Framework Core с входными и выходными параметрами с помощью mysql

Я использую ASP.net Core 2.2 с ядром Entity Framework 2.2.6 и Pomelo.EntityFrameworkCore.MySql 2.2.0 для подключения к MySQL. У меня есть хранимая процедура, которая принимает 3 входных параметра и 1 выходной параметр. Я могу вызвать его в рабочей среде MySQL, например

CALL GetTechniciansByTrade('Automobile', 1, 10, @total);
select @total;

Теперь я хочу вызвать это с помощью ядра инфраструктуры сущностей, код, который я сейчас использую,

var outputParameter = new MySqlParameter("@PageCount", MySqlDbType.Int32);
outputParameter.Direction = System.Data.ParameterDirection.Output;

var results = await _context.GetTechnicians.FromSql("Call GetTechniciansByTrade(@MyTrade, @PageIndex, @PageSize, @PageCount OUT)",
new MySqlParameter("@MyTrade", Trade),
new MySqlParameter("@PageIndex", PageIndex),
new MySqlParameter("@PageSize", PageSize),
outputParameter).ToListAsync();

int PageCount = (int)outputParameter.Value;

Исключение, которое я получаю в настоящее время, это

Поддерживается только ParameterDirection.Input, если CommandType имеет значение Text (имя параметра: @PageCount).


person Hamza Khanzada    schedule 16.10.2019    source источник


Ответы (2)


Можете ли вы попробовать ниже вещи.

  1. Используйте exec вместо вызова

    var results = await _context.GetTechnicians.FromSql("EXEC GetTechniciansByTrade(@MyTrade, @PageIndex, @PageSize, @PageCount OUTPUT)"

  2. Выберите PageCount в хранимой процедуре

Я получил информацию об этой проблеме на github.

person cdev    schedule 17.10.2019
comment
Этот вопрос все еще открыт? Это что-то, что еще не исправлено? - person Hamza Khanzada; 17.10.2019

Я нашел решение, используя предложение @matt-g на основе этого вопроса. Мне пришлось использовать ADO.net для этого как

var technicians = new List<TechnicianModel>();
using (MySqlConnection lconn = new MySqlConnection(_context.Database.GetDbConnection().ConnectionString))
{
    lconn.Open();
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = lconn;
        cmd.CommandText = "GetTechniciansByTrade"; // The name of the Stored Proc
        cmd.CommandType = CommandType.StoredProcedure; // It is a Stored Proc

        cmd.Parameters.AddWithValue("@Trade", Trade);
        cmd.Parameters.AddWithValue("@PageIndex", PageIndex);
        cmd.Parameters.AddWithValue("@PageSize", PageSize);

        cmd.Parameters.AddWithValue("@PageCount", MySqlDbType.Int32);
        cmd.Parameters["@PageCount"].Direction = ParameterDirection.Output; // from System.Data

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                technicians.Add(new TechnicianModel()
                {
                    City = reader["City"].ToString(),
                    ExperienceYears = reader["ExperienceYears"] != null ? Convert.ToInt32(reader["ExperienceYears"]) : 0,
                    Id = Guid.Parse(reader["Id"].ToString()),
                    Name = reader["Name"].ToString(),
                    Qualification = reader["Qualification"].ToString(),
                    Town = reader["Town"].ToString()
                });
            }
        }

        Object obj = cmd.Parameters["@PageCount"].Value;
        var lParam = (Int32)obj;    // more useful datatype
    }
}
person Hamza Khanzada    schedule 20.10.2019