2013-01-03 23 views
18

मैंने अभी एक डेटाबेस बनाया है और अपना पहला माइग्रेशन (केवल एक साधारण तालिका जोड़ें) किया है। अब मैं कुछ संग्रहीत प्रक्रियाओं को जोड़ना चाहता हूं जिन्हें मैंने एसक्यूएल लिखकर और प्रबंधन स्टूडियो में निष्पादित करके जोड़ा है। लेकिन अगर माइग्रेशन में संभव हो तो मैं इन संग्रहीत प्रक्रियाओं को शामिल करना चाहता हूं ताकि वे सहेजे जा सकें और मैं उनके खिलाफ एक ऊपर या नीचे विधि चला सकता हूं। क्या यह संभव है और यदि ऐसा है तो वाक्यविन्यास का उपयोग कैसे किया जाना चाहिए? या क्या मुझे प्रबंधन स्टूडियो का उपयोग करके उन्हें जोड़ना/संपादित करना/हटाना होगा?कोड प्रथम माइग्रेशन और संग्रहीत प्रक्रिया

+0

संभव शिकार http://stackoverflow.com/questions/7667630/can-you-create-sql-views-stored-procedure-using-entity- संशोधित ढांचे -4-1-कोड-एफआईआर –

उत्तर

23

मैं तो इस तरह किया है ...

वर्तमान माइग्रेशन वर्ग में -

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

यदि आप प्रक्रिया को बदल रहे हैं तो क्या होगा क्योंकि यह पिछले माइग्रेशन में बनाया गया था और फिर आपको नीचे जाने की आवश्यकता है? आप उस प्रक्रिया को केवल डीआरओपी नहीं करेंगे, जिसे इसे मूल स्थिति में वापस जाना होगा, जो भी प्रक्रिया पहले की तरह दिखती है ... – Ryan

+1

@Ryan अधिक स्पष्ट रूप से अपडेट करने के लिए अपडेट किया गया बनाम बनाम बनाएं/ड्रॉप करें – NKeddie

+0

मुझे अधिक विशिष्ट दृष्टिकोण पसंद है http://stackoverflow.com/a/27711523/344895 – Madman

7

मैं EF6 और DbMigration वर्ग का उपयोग कर रहा प्रदान करता है तरीकों/ऑल्टर/हटाएं संग्रहित प्रक्रियाओं

बनाने के लिए
  • एक नया संग्रहीत प्रक्रिया बनाएं

    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");     
        } 
    } 
    
  • एक संग्रहीत प्रक्रिया

    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; 
         ");    
        } 
    } 
    
संबंधित मुद्दे