我一直在使用自定义模块,该模块包含一个存储在数据库中的一些字段的窗口小部件。我在窗口小部件中添加了一个新的非必填字段,并且未添加数据库中的相应字段。处理这种变化的最佳方法是什么?
我可以在dev数据库中手动添加一个字段来匹配它,但这对于50个奇怪的生产租户站点来说是不现实的。
答案 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)
字段不应该在数据库中添加列。按设计。