Использование структуры сущностей с базой данных MySQL и конструктором моделей не удается получить сохраненные параметры процедуры - PullRequest
5 голосов
/ 18 июня 2009

У меня есть последний коннектор Mysql, который позволяет вам использовать дизайнер Visual Studio Entity Framework. Это работает отлично, но я только добавил сохраненный процесс.

Обозреватель серверов нормально загрузил его с указанными параметрами, но затем я добавил его в модель сущности, и генерируемый им код не имеет никаких входных параметров.

Вот хранимая процедура

CREATE PROCEDURE `GetViewableMenuNodes`(IN siteId INT, IN parentId INT, IN userName varchar(255))
BEGIN
    select m.*
    from menunode m 
    where m.siteid = siteId
    and m.showinmenu = 1
    and m.parentid = parentId
    and m.viewername = userName;
END

и это код, сгенерированный моделью

public global::System.Data.Objects.ObjectResult<MenuNode> GetViewableMenuNodes()
{
    return base.ExecuteFunction<MenuNode>("GetViewableMenuNodes");
}

Ответы [ 7 ]

6 голосов
/ 05 июля 2011

Если вы считаете это полезным, вот подход, который я использую для работы с хранимыми процедурами с параметрами в MySQL от поставщика MySQL Connector / .NET Entity Framework. Я вызываю ExecuteStoreQuery (). Это освобождает меня от необходимости решать задачи сопоставления процедур с параметрами в модели. Это работает для наших нужд.

    public IList<SearchResultsMember> SearchMembers(int memberID, string countryCode, string regionCode, string cityCode, float distanceKm,
        int genderID, int ageMin, int ageMax, int offsetRowIndex, int maxRows)
    {


        MySqlParameter[] queryParams = new MySqlParameter[] { 
                                        new MySqlParameter("memberIDParam", memberID),
                                        new MySqlParameter("countryCodeParam", countryCode),
                                        new MySqlParameter("regionCodeParam", regionCode),
                                        new MySqlParameter("cityCodeParam", cityCode),
                                        new MySqlParameter("distanceKmParam", distanceKm),
                                        new MySqlParameter("genderIDParam", genderID),
                                        new MySqlParameter("ageMinParam", ageMin),
                                        new MySqlParameter("ageMaxParam", ageMax),
                                        new MySqlParameter("offsetRowIndexParam", offsetRowIndex),
                                        new MySqlParameter("maxRowsParam", maxRows)
                                    };

        StringBuilder sb = new StringBuilder();
        sb.Append("CALL search_members(@memberIDParam, @countryCodeParam, @regionCodeParam, @cityCodeParam, @distanceKmParam, @genderIDParam, @ageMinParam, @ageMaxParam, @offsetRowIndexParam, @maxRowsParam)");

        string commandText = sb.ToString();
        var results = _context.ExecuteStoreQuery<SearchResultsMember>(commandText, queryParams);

        return results.ToList();
    }
4 голосов
/ 23 июля 2013

Вот небольшое расширение, которое мы сделали для выполнения StoredProcedures в нашем DbContext:

    public static List<T> ExecuteStoredProcedure<T>(this DbContext dbContext, string storedProcedureName, params object[] parameters)
    {
        string storedProcedureCommand = "CALL " + storedProcedureName + "(";

        List<object> augmentedParameters = parameters.ToList();

        storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters);

        storedProcedureCommand += ");";

        return dbContext.Database.SqlQuery<T>(storedProcedureCommand).ToList<T>();
    }

    public static List<T> ExecuteStoredRecursiveProcedure<T>(this DbContext dbContext, string storedProcedureName, params object[] parameters)
    {
        string storedProcedureCommand = "SET max_sp_recursion_depth = " + maxRecursionCount + "; CALL " + storedProcedureName + "(";

        List<object> augmentedParameters = parameters.ToList();

        storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters);

        storedProcedureCommand += ");";

        return dbContext.Database.SqlQuery<T>(storedProcedureCommand).ToList<T>();
    }

    private static string AddParametersToCommand(string storedProcedureCommand, List<object> augmentedParameters)
    {
        for (int i = 0; i < augmentedParameters.Count(); i++)
        {
            storedProcedureCommand = AddParameterToCommand(storedProcedureCommand, augmentedParameters, i);
        }
        return storedProcedureCommand;
    }

    private static string AddParameterToCommand(string storedProcedureCommand, List<object> augmentedParameters, int i)
    {
        if (augmentedParameters[i].GetType() == typeof(string))
        {
            storedProcedureCommand += "'";
        }

        storedProcedureCommand += (augmentedParameters[i].ToString());

        if (augmentedParameters[i].GetType() == typeof(string))
        {
            storedProcedureCommand += "'";
        }

        if (i < augmentedParameters.Count - 1)
        {
            storedProcedureCommand += ",";
        }

        return storedProcedureCommand;
    }
3 голосов
/ 21 апреля 2011

Проверьте эту запись об ошибке:

http://bugs.mysql.com/bug.php?id=44985

Извините за удачу. Добро пожаловать в клуб. Очевидно, что надлежащая поддержка хранимых процедур в MySQL из MySQL Connector / .NET Entity Framework недоступна. Как видно из дат в ветке, реакция на эту функцию была невероятно медленной.

2 голосов
/ 12 октября 2014

Вот пример моего кода, который работает с VS2012 и Mysql-коннектором 6.8.3. Просто сгенерируйте вашу модель данных, как обычно, и не забудьте включить хранимые процедуры.

Надеюсь, это кому-нибудь поможет.

public static IList<MyClass> GetCustOrderHist(string someParameter)
    {
        IList<MyClass> data = ((IObjectContextAdapter)TestDashboardEntities).ObjectContext.ExecuteStoreQuery<MyClass>("CALL CustOrderHist({0});", someParameter).ToList();

        return data;
    }

    public class MyClass
    {
        public string ProductName { get; set; }
        public int TOTAL { get; set; }
    }
2 голосов
/ 23 сентября 2014

Также обратите внимание на одну самую важную вещь при работе с базой данных mysql; всегда именуйте параметры хранимых процедур по-разному в соответствии с именами столбцов таблицы, в противном случае они смешиваются в запросе внутри sp.

Например:

CREATE  PROCEDURE `authenticate_user`(
IN p_login_name varchar(50),
IN p_password varchar(80)
)
BEGIN

SELECT `user`.`user_id`,
    `user`.`login_name`,
    `user`.`password`
from users
where `login_name` = p_login_name
and `password` = p_password;

END
2 голосов
/ 23 сентября 2014

Мне нравится, что этот подход с параметрами более безопасен, поскольку он также может справиться с проблемами внедрения SQL. Я сделал это обобщенно следующим образом:

public DbRawSqlQuery<T> ExecuteStoredProcedure<T>(string storedProcedureName, params object[] parameters)
        {            string storedProcedureCommand = "CALL " + storedProcedureName + "(";

            List<object> augmentedParameters = parameters.ToList();

            MySqlParameter[] queryParams;
            storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters, out queryParams);

            storedProcedureCommand += ");";



            return ((DbContext)this).Database.SqlQuery<T>(storedProcedureCommand, queryParams);
        }



        private string AddParametersToCommand(string storedProcedureCommand, List<object> augmentedParameters, out MySqlParameter[] queryParams)
        {
            string paramName = "";
            queryParams = new MySqlParameter[augmentedParameters.Count()];
            for (int i = 0; i < augmentedParameters.Count(); i++)
            {
                paramName = "p" + i;
                queryParams[i] = new MySqlParameter(paramName,augmentedParameters[i]);                                
                storedProcedureCommand += "@" + paramName;

                if (i < augmentedParameters.Count - 1)
                {
                    storedProcedureCommand += ",";
                }
            }
            return storedProcedureCommand;
        }
1 голос
/ 22 июля 2016

Это было мое решение вызвать хранимую процедуру. Я надеюсь, что полезно.

MovieDbEntities db = new MovieDbEntities();
int id = 2;
var result = db.Movie.SqlQuery($"CALL SP_ReadMovie({id})").ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...