2012-08-05 118 views
3

如何強制Orchard重新運行Migrations.Create方法來重新創建模塊的數據?我見過的所有教程都使用Migrations.UpdateFrom方法使Orchard識別模塊數據更改,但這意味着每次在開發過程中進行更改時都必須創建一個新方法。這些方法對實際的版本更新有意義,但不適用於初始開發。Orchard CMS模塊開發工作流程

我試過禁用和重新啓用模塊,沒有骰子。我也嘗試卸載並重新安裝模塊,但運行卸載命令從我的電腦中永久刪除模塊,繞過回收站。

回答

3

我有點困惑的你的問題,但我會盡力回答

遷移更新數據庫,並在數據庫中的數據。如果您想更改儀表板中顯示的視圖,則不應該重新運行遷移。但是,如果要更改模型和數據,則需要運行更多遷移或重置數據庫並運行創建遷移。

當我重建一個模塊我的工作將運行具有禁用/啓用在我的本地版本的模塊進行任何未遷移,

也就是說,如果當前的遷移版本爲1,在遷移中有一個UpdateFrom1方法,這將在項目生成時運行。

你可以檢查下表中的當前版本號Orchard_Framework_DataMigrationRecord

如果你想重新運行強制遷移,你可以在數據庫重置表的價值。或者,您可以備份數據庫,並在運行整套遷移之前進行恢復。

雖然開發我使用短的遷移,每次我需要添加數據時創建一個方法,我嘗試並保持這些很小,以便我可以在開發過程中輕鬆識別任何問題。

然後完成模塊之前,合併遷移到2或3的碼

邏輯塊下面是一個自定義類型

public int Create() 
     { 
      // Define the project type 
      ContentDefinitionManager.AlterTypeDefinition("Project", cfg => cfg 
       .WithSetting("Stereotype", "Content") 
       .CommomPart() 
       .AutoroutePart("our-work") 
       .BodyPart() 
       .WithPart("TitlePart") 
       .WithPart("PublishLaterPart") 
       .WithPart("MenuPart", builder => builder 
        .WithSetting("MenuPart.OnMenu", "true") 
        .WithSetting("MenuPart.CurrentMenu", "Project Menu")) 
       .WithPart("Project") 
       .Creatable() 
       .Draftable()); 

      return 1; 

     } 

     public int UpdateFrom1() 
     { 
      // Define project part - having a part with the same name will create fields in the project type 
      ContentDefinitionManager.AlterPartDefinition("Project", builder => builder 
       .MediaPickerField("MainImage") 
       .MediaPickerField("MediumImage") 
       .MediaPickerField("SmallImage") 
       .MediaPickerField("Logo") 
       .TextField("ShortDescription", Flavour.TextArea) 
       .TextField("Features", Flavour.Markdown) 
       .TextField("ClientTitle", Flavour.DefaultFlavour) 
       .TextField("ClientName", Flavour.DefaultFlavour) 
       .TextField("ClientQuote", Flavour.Textarea) 
       .BooleanField("MainProjectOnHomePage", false) 
       .Attachable()); 

      return 2; 
     } 

遷移我添加了一些擴展方法,使這個更簡潔。

在這裏,他們是

public static class MigrationExtentionHelpers 
    { 
     // part definitions 

     public static ContentPartDefinitionBuilder MediaPickerField(this ContentPartDefinitionBuilder builder, 
                    string name, bool required = true, string hint = "") 
     { 
      var displayName = SplitCamel(name); 

      // default implementation of Media picker field - create overloads for more options 
      return builder.WithField(name, fieldBuilder => fieldBuilder 
         .OfType("MediaPickerField") 
         .WithDisplayName(displayName) 
         .WithSetting("MediaPickerFieldSettings.Required", required.ToString(CultureInfo.InvariantCulture)) 
         .WithSetting("MediaPickerFieldSettings.AllowedExtensions", "jpg png gif") 
         .WithSetting("MediaPickerFieldSettings.Hint", hint)); 

     } 

     public static ContentPartDefinitionBuilder TextField(this ContentPartDefinitionBuilder builder, 
                  string name, Flavour flavor, bool required = true, string hint = "") 
     { 
      var strFlavor = SplitCamel(flavor.ToString()); 

      // default implementation of Media picker field - create overloads for more options 
      return builder.WithField(name, fieldBuilder => fieldBuilder 
         .OfType("TextField") 
         .WithSetting("TextFieldSettings.Required", required.ToString(CultureInfo.InvariantCulture)) 
         .WithSetting("TextFieldSettings.Flavor", strFlavor) 
         .WithSetting("TextFieldSettings.Hint", hint)); 

     } 

     public static ContentPartDefinitionBuilder BooleanField(this ContentPartDefinitionBuilder builder, 
                   string name, bool defalut, string hint = "") 
     { 
      // default implementation of Media picker field - create overloads for more options 
      return builder.WithField(name, fieldBuilder => fieldBuilder 
         .OfType("BooleanField") 
         .WithSetting("BooleanFieldSettings.Hint", hint) 
         .WithSetting("BooleanFieldSettings.DefaultValue", defalut.ToString(CultureInfo.InvariantCulture))); 

     } 

     // type definitions 

     public static ContentTypeDefinitionBuilder AutoroutePart(this ContentTypeDefinitionBuilder builder, string pathPrefix = "") 
     { 
      var pattern = string.Format("[{{Name:'{0}/Title', Pattern: '{0}/{{Content.Slug}}', Description: 'my-page'}}]", pathPrefix); 

      return builder.WithPart("AutoroutePart", partBuilder => partBuilder 
         .WithSetting("AutorouteSettings.PatternDefinitions", pattern)); 
     } 


     public static ContentTypeDefinitionBuilder BodyPart(this ContentTypeDefinitionBuilder builder, 
      Flavour defaultFlavour = Flavour.Markdown) 
     { 
      return builder.WithPart("BodyPart", partBuilder => partBuilder 
         .WithSetting("BodyTypePartSettings.Flavor", defaultFlavour.ToString()));    
     } 

     public static ContentTypeDefinitionBuilder CommomPart(this ContentTypeDefinitionBuilder builder) 
     { 
      return builder.WithPart("CommonPart") 
         .WithSetting("OwnerEditorSettings.ShowOwnerEditor", false.ToString(CultureInfo.InvariantCulture).ToLower()); 

     } 

     private static string SplitCamel(string enumString) 
     { 

      StringBuilder sb = new StringBuilder(); 

      char last = char.MinValue; 
      foreach (char c in enumString) 
      { 
       if (char.IsLower(last) && char.IsUpper(c)) 
       { 
        sb.Append(' '); 
        sb.Append(c.ToString(CultureInfo.InvariantCulture).ToLower()); 
       } 
       else 
       { 
        sb.Append(c); 
       } 
       last = c; 
      } 
      return sb.ToString(); 

     } 
    } 
+1

謝謝,非常有幫助的答案!我想最簡單的方法來處理這個問題就是像你提到的那樣重置數據庫。很遺憾,沒有內置Orchard來處理這個問題。國際海事組織在最初的發展過程中進行「遷移」並不合理。應該使用遷移來允許用戶從舊版本的產品遷移。 – 2012-08-08 15:07:14

+1

是的,我很驚訝沒有在遷移中使用向下/回滾方法,目前在一個更大的項目上工作認爲我會盡可能地將東西分成更小的模塊,但是爲了提高性能,模塊更好...所以我聽到了。 – Axe 2012-08-08 15:39:58

0

基本上沒有辦法運行遷移兩次,我知道,除非你從以前創建的備份還原數據庫或直接調整它的。 對我來說這不是問題,因爲在我的團隊開發過程中,我們使用dbs的本地實例,並在將所有遷移合併到初始實例後部署到測試/分段環境。