无法使用 EF Core 或 LinqToDb EF Core Tools 或 ADO.NET 运行任何存储过程创建脚本
Posted
技术标签:
【中文标题】无法使用 EF Core 或 LinqToDb EF Core Tools 或 ADO.NET 运行任何存储过程创建脚本【英文标题】:Cannot run any stored procedure creation script using EF Core or LinqToDb EF Core Tools or ADO.NET 【发布时间】:2021-10-07 12:55:02 【问题描述】:重现步骤:
var s = @"USE `my_schema`;
DROP procedure IF EXISTS `new_procedure`;
DELIMITER $$
USE `my_schema`$$
CREATE PROCEDURE `new_procedure` ()
BEGIN
select 1;
END$$
DELIMITER ;
";
await dbContext.Database.ExecuteSqlRawAsync(s);
例外:
MySQL 版本:8.0.21 Microsoft.EntityFrameworkCore 版本:5.0.8 Pomelo.EntityFrameworkCore.MySql 版本:5.0.0 .NET 版本:5.0.302您的 SQL 语法有错误;查看与您的 mysql 服务器版本相对应的手册,了解在 'DELIMITER $$ 附近使用的正确语法 CREATE DEFINER=
root
@%
PROCEDUREnew_procedure
()
【问题讨论】:
如果您使用客户端工具直接在您的 mysql 数据库上运行该 sql 语句,它是否有效? @rene 是的。 (通过 Workbench v8.0.25) 【参考方案1】:你必须使用MySqlScript
类,但Pomelo驱动使用MySqlConnector
库,库中不包含实现tracking Issue
但您可以从 Oracle 的源代码中复制它的实现:
https://github.com/mysql/mysql-connector-net/blob/6.9/Source/MySql.Data/MySqlScript.cs
用法很简单:
using (var connection = new MySqlConnection(connectionString))
var script = new MySqlScript(connection, scriptText);
connection.Open();
script.Execute();
【讨论】:
【参考方案2】:来自https://mysqlconnector.net/troubleshooting/delimiter/:
MySqlConnector 中不存在此限制,因此无需使用
DELIMITER
,必须将其移除(以避免向服务器发送无效的 SQL)。要解决此问题,请删除
DELIMITER
声明和分隔符的任何尾随实例:
var s = @"USE `my_schema`;
DROP procedure IF EXISTS `new_procedure`;
CREATE PROCEDURE `new_procedure` ()
BEGIN
select 1;
END;
";
await dbContext.Database.ExecuteSqlRawAsync(s);
【讨论】:
以上是关于无法使用 EF Core 或 LinqToDb EF Core Tools 或 ADO.NET 运行任何存储过程创建脚本的主要内容,如果未能解决你的问题,请参考以下文章
Azure 函数 5 和 EF Core 5 无法加载文件或程序集 > Microsoft.Extensions.DependencyInjection.Abstractions