C#MySQL EF 6 Code First迁移创建自定义存储过程,其中动态where子句prepare语句提供错误

时间:2016-07-05 13:56:43

标签: c# mysql entity-framework-6 ef-migrations

我正在使用MySql 5.5数据库。我使用Entity Framework代码首次迁移创建了我的数据库,并使用DBContext类中的MapToStoredProcedures()方法为Insert Update和delete操作创建了默认存储过程。我正在尝试添加自定义迁移类。以下代码段:

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

除上述链接共享外,有没有人知道如何解决此问题或任何可用的工作?

1 个答案:

答案 0 :(得分:0)

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

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

同样在连接字符串中,应指定Allow User Variables = true,否则这将不起作用。