Orchard CMS - 如何使用数据库管理自定义模块小部件的新字段?

时间:2012-05-29 19:40:09

标签: orchardcms

我一直在使用自定义模块,该模块包含一个存储在数据库中的一些字段的窗口小部件。我在窗口小部件中添加了一个新的非必填字段,并且未添加数据库中的相应字段。处理这种变化的最佳方法是什么?

我可以在dev数据库中手动添加一个字段来匹配它,但这对于50个奇怪的生产租户站点来说是不现实的。

3 个答案:

答案 0 :(得分:2)

要扩展@ 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所说here,字段更容易创建,但更难查询。

查看您发布的解决方案,看起来您正在添加自定义列,而不是Orchard Fields。如果您正在尝试做的事情,那么您应该使用AddColumn在模块的数据迁移中执行某些操作,如here所述。这看起来像是:

public int UpdateFrom1() {
    SchemaBuilder.AlterTable("TABLE_NAME", table => table
            .AddColumn<int>("mynewcolumn")
            .AddColumn<string>("mynewcolumn2")
       );
    return 2;
}

答案 1 :(得分: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'

答案 2 :(得分:0)

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