mysql - Entity Framework mysql - 创建函数时出错

标签 mysql entity-framework ef-code-first

我正在尝试使用 Entity Framework 迁移在我的 mySQL 数据库中创建一个函数。当我直接在 MySQL Workbench 中运行它时,SQL 运行良好,但在 EF 迁移中运行时失败。

如何使用 EF 迁移创建函数?

     Sql(@"
DROP function IF EXISTS `f_JumperName`;

DELIMITER $$
CREATE FUNCTION `f_JumperName` 
(
    JumperID int
)
RETURNS varchar(500)
BEGIN
    DECLARE result VARCHAR(500);

    SELECT j.LastName + ', ' + j.FirstName
    INTO result
    FROM Jumper j
    WHERE j.JumperID = JumperID;

    RETURN x;
END$$

DELIMITER ;
");

错误消息:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'DELIMITER $$ 附近使用的正确语法 创建函数 f_JumperName (...

最佳答案

看来问题是由DELIMITER句引起的。

要解决这个问题,您可以将 SQL 分成句子,这样您就不需要重新定义 ; 分隔符。您会得到两个单独的句子,一个用于drop,另一个用于create function:

public override void Up()
{
    Sql(@"DROP function IF EXISTS `f_JumperName`;");
    Sql(@"CREATE FUNCTION `f_JumperName` 
        (
            JumperID int
        )
        RETURNS varchar(500)
        BEGIN
            DECLARE result VARCHAR(500);
            SELECT j.LastName + ', ' + j.FirstName
            INTO result
            FROM Jumper j
            WHERE j.JumperID = JumperID;

            RETURN x;
        END;");
}

然后在第二句末尾将之前的 $$ 字符替换为 ;

这并没有解决真正的问题,即无法正确设置定界符,但它确实有效。我找到了一些关于通过 MySQL 连接器提供的 MySqlScript.Delimiter 属性真正更改分隔符的页面,但我不知道在迁移文件,因为您必须以某种方式访问​​与数据库的真实连接。我不太确定它可以在这里使用。

关于mysql - Entity Framework mysql - 创建函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333258/

相关文章:

php - 切换数据库值

c# - 使用 xbuild 和 mono 时未嵌入 Entity Framework 元数据工件

c# - 如何使用 Entity Framework 4.1 Code First 为数据库中的一对多关系强制建立一对一关系

entity-framework - 首先使用 EF 代码在数据库级别停止空字符串

php - Bash echo-pipe 进入 Mysql shell 失败

mysql - 3 个文本字段的唯一索引

php - SQL UPDATE 查询因 LIMIT 1 而失败,但适用于 LIMIT 2

c# - 使用静态属性的 StringLengh 数据注解

c# - Entity Framework Core 读取和更新多行 - 复合主键

entity-framework-4.1 - EF 4.1 Code First 数据库初始化 System.NullReferenceException 加载数据