0

DBにいくつかのフィールドが保存されたウィジェットを持つカスタムモジュールを使用してきました。必須ではない新しいフィールドをウィジェットに追加しましたが、データベース内の対応するフィールドが追加されません。この種の変更を処理する最善の方法は何ですか?

それに一致するように開発データベースにフィールドを手動で追加できますが、これは 50 の奇妙な運用テナント サイトでは非現実的です。

4

3 に答える 3

2

@Bertand の回答を少し拡張するには、フィールド (ブール フィールド、テキスト フィールド、メディア ピッカー フィールドなど) をコンテンツ パーツに追加するときにデータベース列を作成する必要はありません。データベース。

フィールドは、コンテンツ パーツに対してシリアル化された XML として格納されます。私のレコードはすべてテーブルに保存されていOrchard_Framework_ContentItemVersionRecordます(同様のテーブルOrchard_Framework_ContentItemRecordがありますが、使用されていないようです.

XML は基本的に次の形式です。

<Data>
    <SomePart>
        <SomeFieldName SomeFieldProperty=”value”
                       SomeOtherProperty=”value”&gt;FieldValue</SomeFieldName>
    </SomePart>
    <SomeOtherPart>
        <SomeOtherFieldName>FieldValue</SomeOtherFieldName>
    </SomeOtherPart>
</Data>

たとえば、次のようなものがあります。

<Data>
    <PicturePart>
        <picture AlternateText="" Class="" Style="" Alignment="" Width="1219"
                 Height="709">~/Media/Default/images/greatPicture.jpg</picture>
    </PicturePart>
    <PictureType>
        <ExtraDescription>It’s a great picture!</ExtraDescription>
    </Pictureype>
</Data>

Orchard は、Settings_XXXRecordテーブルからの情報を使用して、フィールドをデータベースから逆シリアル化するときにフィールドの型を決定します。

これらすべてが、Bertand がここで述べているように、フィールドを作成するのは簡単ですが、クエリを実行するのが難しい理由です。

投稿したソリューションを見ると、オーチャード フィールドではなくカスタム列を追加しているようです。これあなたがやろうとしていることである場合、ここで説明されているように、AddColumn を使用してモジュールのデータ移行で行う必要があるように思えます。これは次のようになります。

public int UpdateFrom1() {
    SchemaBuilder.AlterTable("TABLE_NAME", table => table
            .AddColumn<int>("mynewcolumn")
            .AddColumn<string>("mynewcolumn2")
       );
    return 2;
}
于 2012-05-30T09:35:22.523 に答える
0

フィールドは、データベースに列を追加することは想定されていません。意図的に。

于 2012-05-29T23:53:08.263 に答える
0

それが理想的な解決策かどうかはわかりませんが、すべてのテナント サイトのモジュール テーブルに列を手動で追加する SQL スクリプトを実行すると、うまくいくようです。幸いなことに、すべてのサイトが同じデータベースに存在するようにセットアップしました!

SELECT 'Alter table ' + TABLE_NAME + ' Add mynewcolumn int null, mynewcolumn2 nvarchar(15) null' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%the_suffix_my_module_puts_for_a_tenant'

于 2012-05-29T20:20:48.550 に答える