2016-07-05 22 views
0

私はMySql 5.5データベースを使用しています。 Entity Frameworkコードの最初の移行を使用してデータベースを作成し、DBContextクラスのMapToStoredProcedures()メソッドを使用してInsert UpdateおよびDelete操作のデフォルトストアドプロシージャを作成しました。カスタム移行クラスを追加しようとしています。以下のコードスニペット:私は更新-Databaseコマンドを使用するとC#MySQL EF 6コードの最初の移行動的where句prepareステートメントでエラーが発生するカスタムストアドプロシージャを作成

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;"); 
    } 
} 

、ビューには、データベースに正しく作成取得されますが、ストアドプロシージャを作成するために、私は、エラーの下に受けています。

"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を記述していますが、データベースを更新している間は@ symbolなしのクエリとして検討しています。

ここでは、シードメソッドでそれらを作成する方法を示します。しかし、私はこれを好まない。 Can you create sql views/stored procedure using Entity Framework 4.1 Code first approach

上記のリンクとは別に、この問題や回避策を解決する方法を知っている人はいますか?

答えて

0

CreateStoredProcedure()は、mysqlデータベース内のストアドプロシージャを作成することを意図していますが、Prepareステートメントを使用すると正しく動作しません。

CreateStoredProcedure()メソッドを使用する代わりに、私はストアドプロシージャを作成するためにSql()を使用し、最後に機能しました。

また、接続文字列では、Allow User Variables = trueを指定しないとこれが機能しません。

関連する問題