我一直在使用一个自定义模块,该模块有一个小部件,其中一些字段存储在数据库中。我向小部件添加了一个新的非必填字段,并且未添加数据库中的相应字段。处理此类更改的最佳方法是什么?
我可以在开发数据库中手动添加一个字段来匹配它,但这对于 50 个奇怪的生产租户站点来说是不现实的。
我一直在使用一个自定义模块,该模块有一个小部件,其中一些字段存储在数据库中。我向小部件添加了一个新的非必填字段,并且未添加数据库中的相应字段。处理此类更改的最佳方法是什么?
我可以在开发数据库中手动添加一个字段来匹配它,但这对于 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 所说,字段更容易创建,但更难查询。
查看您发布的解决方案,您似乎正在添加自定义列,而不是 Orchard Fields。如果这是您想要做的,那么您似乎应该使用 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'
字段不应该在数据库中添加列。按设计。