DBにいくつかのフィールドが保存されたウィジェットを持つカスタムモジュールを使用してきました。必須ではない新しいフィールドをウィジェットに追加しましたが、データベース内の対応するフィールドが追加されません。この種の変更を処理する最善の方法は何ですか?
それに一致するように開発データベースにフィールドを手動で追加できますが、これは 50 の奇妙な運用テナント サイトでは非現実的です。
DBにいくつかのフィールドが保存されたウィジェットを持つカスタムモジュールを使用してきました。必須ではない新しいフィールドをウィジェットに追加しましたが、データベース内の対応するフィールドが追加されません。この種の変更を処理する最善の方法は何ですか?
それに一致するように開発データベースにフィールドを手動で追加できますが、これは 50 の奇妙な運用テナント サイトでは非現実的です。
@Bertand の回答を少し拡張するには、フィールド (ブール フィールド、テキスト フィールド、メディア ピッカー フィールドなど) をコンテンツ パーツに追加するときにデータベース列を作成する必要はありません。データベース。
フィールドは、コンテンツ パーツに対してシリアル化された XML として格納されます。私のレコードはすべてテーブルに保存されていOrchard_Framework_ContentItemVersionRecord
ます(同様のテーブルOrchard_Framework_ContentItemRecord
がありますが、使用されていないようです.
XML は基本的に次の形式です。
<Data>
<SomePart>
<SomeFieldName SomeFieldProperty=”value”
SomeOtherProperty=”value”>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;
}
フィールドは、データベースに列を追加することは想定されていません。意図的に。
それが理想的な解決策かどうかはわかりませんが、すべてのテナント サイトのモジュール テーブルに列を手動で追加する 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'