web-dev-qa-db-fra.com

Créer d'abord des procédures stockées en utilisant Entity Framework Code?

J'utilise Entity Framework Code First dans mon projet actuel. Une base de données comprend de nombreuses tables, de nombreuses vues et de nombreuses fonctions. Je suis capable de créer des tables en utilisant d'abord Entity Framework Code. Mais je ne parviens pas à trouver un moyen de créer des procédures stockées à l'aide de Entity Framework Code First. Je sais que la stratégie Database-First répondra à mes exigences et tout fonctionne bien, mais je ne veux pas utiliser la stratégie Database-First dans mon code de projet existant.

S'il vous plaît, aidez-moi, quelles sont les meilleures façons de créer des procédures stockées à l'aide de la stratégie Entity Framework Code First?

25
sridharnetha

Au lieu d'utiliser StringBuilder, vous pouvez utiliser les méthodes EF existantes

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

Avec Code First, vous effectuez toujours des migrations. Les migrations héritent de l'objet DbMigration, qui a une méthode très utile:

DbMigration.Sql (chaîne)

Voici les étapes:

1) Ouvrez la console du gestionnaire de packages à partir du gestionnaire de packages NuGet

2) Tapez add-migration CreateHelloWorldStoredProcedureExample

3) Le Visual Studio vous montrerait une nouvelle classe avec deux méthodes vides: Up et Down

4) Dans la méthode Up, écrivez votre code, voici un exemple

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

En mode Down:

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

Après cela, lancez simplement update-database et c'est tout!

Remarque: si vous utilisez SQL Server, évitez d'utiliser la phrase GO.

Si vous utilisez EF Core 2.1, vous pouvez créer une procédure stockée de la manière suivante:

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