C# MySQL EF 6 代码优先迁移使用动态 where 子句准备语句创建自定义存储过程时出错

C# MySQL EF 6 Code First Migrations Create Custom Stored procedure with dynamic where clause prepare statement gives error

我正在使用 MySql 5.5 数据库。我使用 Entity Framework 代码优先迁移创建了我的数据库,并使用 DBContext class 中的 MapToStoredProcedures() 方法为插入更新和删除操作创建了默认存储过程。我正在尝试添加自定义迁移 class。下面的代码片段:

using System;
using System.Data.Entity.Migrations;

public partial class Views : DbMigration
{
    public override void Up()
    {
        Sql(@"
            CREATE VIEW View_Jobs
            AS 
            select 
            job.JobId as JobId,
            job.JobNo as JobNo,
            ....";
        );

        CreateStoredProcedure(
           "dbo.GetOpenJobs",
           p => new
           {
               UserId = p.Long(),
               RoleId = p.Long()
           },
           body:
            @"
            DECLARE query varchar(1000);
            DECLARE strWhere varchar(100);

            set @query = 'select JobId, JobNo, ... from view_jobs  ';

            IF RoleId <> 1 THEN
                set @query = concat(@query, ' WHERE AssignedTo = ', UserId, ' AND AssignedToRole = ', RoleId, ' ');  
            end if;

            set @query = concat(@query, ' group by JobId, JobNo,... ');

            select @query;

            PREPARE stmt FROM @query;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;"
        );
    }

    public override void Down()
    {
        DropStoredProcedure("dbo.GetOpenJobs");
        Sql(@"DROP VIEW IF EXISTS view_jobs;");
    }
}

当我使用 Update-Database 命令时,视图已在数据库中正确创建,但在创建存储过程时我收到以下错误。

"You have an error in your SQL syntax; check the manual that corresponds to     your MySQL server version for the right syntax to use near 'query;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
 END' at line 19"

相同的存储过程在数据库中运行良好。 尽管我在我的 .NET 代码中提到了 @query,但在更新数据库时,它被视为没有 @ 符号的查询。

这是一种在种子方法中创建它们的变通方法。但我不喜欢这个。 Can you create sql views / stored procedure using Entity Framework 4.1 Code first approach

有谁知道如何解决此问题或除上述 link 共享之外的任何可用解决方法?

CreateStoredProcedure() 虽然旨在在 mysql 数据库中创建存储过程,但如果我们在其中使用 Prepare 语句,则无法正常工作。

我没有使用 CreateStoredProcedure() 方法,而是使用了 Sql() 来创建存储过程,最后它成功了。

同样在连接字符串中,应指定 Allow User Variables=true,否则将无法正常工作。