0

我一直在使用一个自定义模块,该模块有一个小部件,其中一些字段存储在数据库中。我向小部件添加了一个新的非必填字段,并且未添加数据库中的相应字段。处理此类更改的最佳方法是什么?

我可以在开发数据库中手动添加一个字段来匹配它,但这对于 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 所说字段更容易创建,但更难查询。

查看您发布的解决方案,您似乎正在添加自定义列,而不是 Orchard Fields。如果这您想要做的,那么您似乎应该使用 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

我不确定这是否是理想的解决方案,但运行一个 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 回答
0

字段不应该在数据库中添加列。按设计。

于 2012-05-29T23:53:08.263 回答