NET Core中使用pomelo.entityframeworkcore.mysql调用存储过程

时间:2018-10-18 17:37:23

标签: mysql asp.net-core .net-core

我在MySQL中有数据库,使用常见的mysql实体框架最终会出错,因此我切换到pomelo.entityframeworkcore.mysql。

在我的MySQL Db中,我没有几个存储过程。但我不了解如何与之沟通。通常的mysql查询可以完美运行,并且可以正常运行,就像这样:

public void ONELINE_SQL_TEST()
{
    var db = new DBContext();
    var test = db.DocumentsInfo.FromSql("SELECT * FROM `DocumentsInfo` LIMIT 0, 2").ToList();         
}

DocumentsInfo是我的Model类/我的mysql表之一。

但是我无法调用存储过程,不断收到错误:

USE `testProj`$$
CREATE PROCEDURE `GetDocumentsByName` (DocName varchar(255))
BEGIN
Select * from AllDocuments where DocumentName like DocName;
END$$

DELIMITER ;

我尝试过的代码:

var docs1 = db.DocumentsInfo.FromSql("GetDocumentByName @DocName = {0}", Filename).ToList(); //not working
var docs2 = db.DocumentsInfo.FromSql("GetDocumentByName @p0", Filename).ToList(); //not working

错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以使用正确的语法   第1行的'GetDocumentByName'nameAZ'附近   enter image description here

1 个答案:

答案 0 :(得分:0)

您需要从内存中将CALL放在sql存储过程之前:)

var docs1 = db.DocumentsInfo.FromSql("CALL GetDocumentByName @p0",    Filename).ToList();

最后,我读到EF Core不支持存储过程的命名参数,因此@ p0因此,如果您有1个以上的参数,并说其中一个是路径,则可以执行以下操作:

var docs1 = db.DocumentsInfo.FromSql("CALL GetDocumentByName @p0, @p1",    parameters: new[] { Path, Filename }).ToList();