web-dev-qa-db-ja.com

Entity Framework Code Firstを使用してストアドプロシージャを作成しますか?

現在のプロジェクトでEntity Framework Code Firstを使用しています。データベースは、多くのテーブル、多くのビュー、および多くの機能で構成されています。 Entity Framework Code Firstを使用してテーブルを作成できます。しかし、Entity Framework Code Firstを使用してストアドプロシージャを作成する方法を見つけることができません。 Database-First戦略が私の要件を満たし、すべてがうまく機能することは知っていますが、Database-First戦略を既存のプロジェクトコードに使用したくありません。

誰か助けてください、Entity Framework Code First戦略を使用してストアドプロシージャを作成する最良の方法は何ですか?

25
sridharnetha

StringBuilderを使用する代わりに、既存のEFメソッドを使用できます。

public override void Up() 
{
  CreateStoredProcedure(
    "MyStoredProcedure",
    p => new
    {
        id = p.Int()
    },
    @"SELECT some-data FROM my-table WHERE id = @id"
  );
}

public override void Down() 
{
  DropStoredProcedure("MyStoredProcedure");
}
24
Ruslan

Code Firstでは、常に移行を行います。移行は、非常に便利なメソッドを持つDbMigrationオブジェクトを継承します。

DbMigration.Sql(string)

手順は次のとおりです。

1)NuGetパッケージマネージャーからパッケージマネージャーコンソールを開きます

2)add-migration CreateHelloWorldStoredProcedureExampleと入力します

3)Visual Studioは、UpとDownという2つの空のメソッドを持つ新しいクラスを表示します

4)Upメソッドで、コードを記述します。以下に例を示します

 public override void Up()
 {
        StringBuilder storedProcedureCode = new StringBuilder();

        storedProcedureCode.Append("CREATE PROCEDURE dbo.HelloWorld" + Environment.NewLine);
        storedProcedureCode.Append("AS" + Environment.NewLine);
        storedProcedureCode.Append("BEGIN" + Environment.NewLine);
        storedProcedureCode.Append(@"SELECT 'Hello World'" + Environment.NewLine);
        storedProcedureCode.Append("END" + Environment.NewLine);

        this.Sql(storedProcedureCode.ToString());
}

ダウン方式の場合:

public override void Down()
    {
        this.Sql("DROP PROCEDURE dbo.HelloWorld ");
    }

この後、update-databaseを実行するだけです!

:SQL Serverを使用する場合は、GO文の使用を避けてください。

EF Core 2.1を使用している場合、次のような方法でストアドプロシージャを作成できます。

public partial class AddStoredProcedure : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"your create procedure statement");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"your drop procedure statement");
    }
}
3
Viktors Telle