我正在使用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
除上述链接共享外,有没有人知道如何解决此问题或任何可用的工作?
答案 0 :(得分:0)
CreateStoredProcedure()虽然打算在mysql数据库中创建存储过程但是如果我们在其中使用Prepare语句则无法正常工作。
我没有使用CreateStoredProcedure()方法,而是使用Sql()来创建存储过程,最后它起作用了。
同样在连接字符串中,应指定Allow User Variables = true,否则这将不起作用。