3

Orchard で Migrations.Create メソッドを再実行して、モジュールのデータを再作成するにはどうすればよいですか? これまで見てきたすべてのチュートリアルでは、Migrations.UpdateFrom メソッドを使用して Orchard にモジュール データの変更を認識させていますが、これは、開発中に変更を加えるたびに新しいメソッドを作成する必要があることを意味します。これらの方法は、実際のバージョン更新には意味がありますが、初期開発には意味がありません。

モジュールを無効にして再度有効にしようとしましたが、ダイスはありません。モジュールのアンインストールと再インストールも試みましたが、アンインストール コマンドを実行すると、ごみ箱をバイパスしてモジュールがコンピューターから完全に削除されました。

4

2 に答える 2

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

        }
    }
于 2012-08-05T23:05:29.373 に答える