无法使用 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);

例外:

您的 SQL 语法有错误;查看与您的 mysql 服务器版本相对应的手册,了解在 'DELIMITER $$ 附近使用的正确语法 CREATE DEFINER=root@% PROCEDURE new_procedure()

MySQL 版本:8.0.21 Microsoft.EntityFrameworkCore 版本:5.0.8 Pomelo.EntityFrameworkCore.MySql 版本:5.0.0 .NET 版本:5.0.302

【问题讨论】:

如果您使用客户端工具直接在您的 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 运行任何存储过程创建脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 NET Core 和 EF Core 构建谓词

EF Core 中的一对零或一对关系

.NET 6 使用 EF CORE 进行迁移

Azure 函数 5 和 EF Core 5 无法加载文件或程序集 > Microsoft.Extensions.DependencyInjection.Abstractions

无法翻译 LINQ 表达式。以可翻译的形式重写查询,或切换到客户端评估 EF Core 3.1

更新 ContextModelSnapshot EF Core