Csharp/C#教程:使用具有MySQL DB的entity framework和模型设计器不会拾取存储的proc参数分享


使用具有MySQL DB的entity framework和模型设计器不会拾取存储的proc参数

我有最新的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 GetViewableMenuNodes() { return base.ExecuteFunction("GetViewableMenuNodes"); } 

看看这个bug条目:

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

抱歉,祝你好运。 欢迎来到俱乐部。 显然,MySQL Connector / .NET Entity Framework中对MySQL存储过程的适当支持是不可用的。 从线程中的日期可以看出,引入该function的响应速度非常慢。

如果您发现这有用,这里是我用来处理MySQL连接器/ .NETentity framework提供程序中MySQL参数的存储过程的方法。 我调用ExecuteStoreQuery()。 这使我不必处理模型中参数映射过程的挑战。 这符合我们的需求。

  public IList 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(commandText, queryParams); return results.ToList(); } 

这是我们在DbContext上执行StoredProcedures所做的一点扩展:

  public static List ExecuteStoredProcedure(this DbContext dbContext, string storedProcedureName, params object[] parameters) { string storedProcedureCommand = "CALL " + storedProcedureName + "("; List augmentedParameters = parameters.ToList(); storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters); storedProcedureCommand += ");"; return dbContext.Database.SqlQuery(storedProcedureCommand).ToList(); } public static List ExecuteStoredRecursiveProcedure(this DbContext dbContext, string storedProcedureName, params object[] parameters) { string storedProcedureCommand = "SET max_sp_recursion_depth = " + maxRecursionCount + "; CALL " + storedProcedureName + "("; List augmentedParameters = parameters.ToList(); storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters); storedProcedureCommand += ");"; return dbContext.Database.SqlQuery(storedProcedureCommand).ToList(); } private static string AddParametersToCommand(string storedProcedureCommand, List augmentedParameters) { for (int i = 0; i < augmentedParameters.Count(); i++) { storedProcedureCommand = AddParameterToCommand(storedProcedureCommand, augmentedParameters, i); } return storedProcedureCommand; } private static string AddParameterToCommand(string storedProcedureCommand, List 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; } 

我喜欢这个参数方法更安全,因为它也可以处理sql注入问题。 我把它概括如下:

 public DbRawSqlQuery ExecuteStoredProcedure(string storedProcedureName, params object[] parameters) { string storedProcedureCommand = "CALL " + storedProcedureName + "("; List augmentedParameters = parameters.ToList(); MySqlParameter[] queryParams; storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters, out queryParams); storedProcedureCommand += ");"; return ((DbContext)this).Database.SqlQuery(storedProcedureCommand, queryParams); } private string AddParametersToCommand(string storedProcedureCommand, List 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; } 

还要注意处理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 

下面是我的代码示例,它使用VS2012和Mysql连接器6.8.3只是像往常一样生成您的数据模型,不要忘记包含存储过程。

希望这有帮助的人。

 public static IList GetCustOrderHist(string someParameter) { IList data = ((IObjectContextAdapter)TestDashboardEntities).ObjectContext.ExecuteStoreQuery("CALL CustOrderHist({0});", someParameter).ToList(); return data; } public class MyClass { public string ProductName { get; set; } public int TOTAL { get; set; } } 

这是我调用存储过程的解决方案。 我希望有用。

上述就是C#学习教程:使用具有MySQL DB的entity framework和模型设计器不会拾取存储的proc参数分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 MovieDbEntities db = new MovieDbEntities(); int id = 2; var result = db.Movie.SqlQuery($"CALL SP_ReadMovie({id})").ToList(); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1022080.html

(0)
上一篇 2022年1月6日
下一篇 2022年1月6日

精彩推荐