2013-01-03 13 views
18

Ho appena creato un database e fatto la mia prima migrazione (solo una semplice tabella aggiunta). Ora voglio aggiungere alcune stored procedure che ho appena aggiunto scrivendo lo sql e eseguendolo in Management Studio. Ma vorrei includere queste stored procedure se possibile in una migrazione in modo che vengano salvate e posso eseguire un metodo su o giù contro di loro. È possibile e in tal caso quale sintassi deve essere utilizzata? O dovrò semplicemente aggiungere/modificare/rimuovere usando Management Studio?Code First Migrations and Stored Procedure

+0

possibile vittima http://stackoverflow.com/questions/7667630/can-you-create-sql-views-stored-procedure-using-entity- framework-4-1-code-firs –

risposta

23

Ho fatto questo in questo modo ...

Nella classe di migrazione corrente -

public partial class MyMigration : DbMigration 
{ 
    public override void Up() 
    { 
     ... other table creation logic 

     // This command executes the SQL you have written 
     // to create the stored procedures 
     Sql(InstallScript); 

     // or, to alter stored procedures 
     Sql(AlterScript); 
    } 

    public override void Down() 
    { 
     ... other table removal logic 

     // This command executes the SQL you have written 
     // to drop the stored procedures 
     Sql(UninstallScript); 

     // or, to rollback stored procedures 
     Sql(RollbackScript); 
    } 

    private const string InstallScript = @" 
     CREATE PROCEDURE [dbo].[MyProcedure] 
     ... SP logic here ... 
    "; 

    private const string UninstallScript = @" 
     DROP PROCEDURE [dbo].[MyProcedure]; 
    "; 

    // or for alters 
    private const string AlterScript = @" 
     ALTER PROCEDURE [dbo].[AnotherProcedure] 
     ... Newer SP logic here ... 
    "; 

    private const string RollbackScript = @" 
     ALTER PROCEDURE [dbo].[AnotherProcedure] 
     ... Previous/Old SP logic here ... 
    "; 
} 
+0

Che dire se stai modificando la procedura perché è stata creata in una migrazione precedente e quindi devi andare giù? Non dovresti semplicemente GOCCARE la procedura che dovrebbe tornare al suo stato originale, che è come prima la procedura ... – Ryan

+1

@Ryan aggiornato per mostrare più chiaramente un alter vs. crea/rilascia – NKeddie

+0

Mi piace un approccio più specifico http://stackoverflow.com/a/27711523/344895 – Madman

7

Sto usando EF6 e la classe DbMigration fornisce metodi per creare/Alter/Delete stored procedure

  • Creare una nuova stored procedure

    public partial class MyFirstMigration : DbMigration 
    { 
        public override void Up() 
        { 
         // Create a new store procedure 
         CreateStoredProcedure("dbo.DequeueMessages" 
         // These are stored procedure parameters 
         , c => new{     
          MessageCount = c.Int() 
         }, 
         // Here is the stored procedure body 
         @" 
         SET NOCOUNT ON; 
         SELECT TOP (@MessageCount) 
          * 
         FROM 
          dbo.MyTable; 
         "); 
        } 
    
        public override void Down() 
        { 
         // Delete the stored procedure 
         DropStoredProcedure("dbo.DequeueMessages");     
        } 
    } 
    
  • Modificare una procedura immagazzinata

    public partial class MySecondMigration : DbMigration 
    { 
        public override void Up() 
        { 
         // Modify an existing stored procedure 
         AlterStoredProcedure("dbo.DequeueMessages" 
         // These are new stored procedure parameters 
         , c => new{     
          MessageCount = c.Int(), 
          StatusId = c.Int() 
         }, 
         // Here is the new stored procedure body 
         @" 
         SET NOCOUNT ON; 
         SELECT TOP (@MessageCount) 
          * 
         FROM 
          dbo.MyTable 
         WHERE 
          StatusId = @StatusId; 
         "); 
        } 
    
        public override void Down() 
        { 
         // Rollback to the previous stored procedure 
         // Modify an existing stored procedure 
         AlterStoredProcedure("dbo.DequeueMessages" 
         // These are old stored procedure parameters 
         , c => new{     
          MessageCount = c.Int() 
         }, 
         // Here is the old stored procedure body 
         @" 
         SET NOCOUNT ON; 
         SELECT TOP (@MessageCount) 
          * 
         FROM 
          dbo.MyTable; 
         ");    
        } 
    }