将PropertyData迁移到新的PropertyType

问题描述 投票:1回答:1

我们有一个名为PropertyTypeIsPublic,它使用了Umbraco.TrueFalse属性编辑器。

需求已更改,此值现在需要由多个复选框表示,这些复选框是使用值PublicGroup1Group2从枚举驱动的。

这一切都按预期工作,但我们希望保存内容编辑器中的10个数千个文档,以便手动填充它们。

在Umbraco中保存文档,我可以看到它在cmsPropertyData表中创建了一个条目,[ "Public", "Group1", "Group2" ]列中的值为dataNvarchar

我写了一个脚本,根据原始IsPublic标志的值在该表中插入一行。

但是,在运行此操作后,在Umbraco中打开文档时,不会显示更改。

用于更新的脚本是

DECLARE @HasPublicFlag NVARCHAR(50) = '[    "Public",    "Group1",    "Group2"  ]'
DECLARE @NoPublicFlag NVARCHAR(50) = '[    "Group1",    "Group2"  ]'

DECLARE @feature INT = (SELECT nodeId FROM cmsContentType WHERE Alias = 'Feature')

--Existing IsPublic flag
DECLARE @featureIsPublic INT = (SELECT id FROM cmsPropertyType WHERE Alias = 'IsPublic' AND contentTypeId = @feature)

--New PropertyType
DECLARE @featureRoleRestriction INT = (SELECT id FROM cmsPropertyType WHERE Alias = 'documentRoleRestriction' AND contentTypeId = @page)

--Get feature document versions that are either newest version or published
;WITH FeatureDocumentsToUpdate AS
(
    SELECT d.*, pd.dataInt
    FROM cmsDocument d 
    JOIN cmsPropertyData pd ON pd.versionId = d.versionId
    LEFT JOIN cmsPropertyData pd2 ON pd2.versionId = d.versionId AND pd2.propertytypeid = @featureRoleRestriction
    WHERE (d.newest = 1 OR d.Published = 1) AND pd.propertytypeid = @featureIsPublic AND pd2.id IS NULL
)

--INSERT INTO cmsPropertyData based on value of existing flag
INSERT INTO cmsPropertyData(contentNodeId, versionId, propertytypeid, dataNvarchar)
SELECT s.nodeId, versionId, @featureRoleRestriction, 
    CASE WHEN s.dataInt = 0 THEN @NoPublicFlag ELSE @HasPublicFlag END AS NewValue
FROM FeatureDocumentsToUpdate s

是否有其他表需要更新或有更好的方法吗?

umbraco umbraco7
1个回答
0
投票

我的猜测是你需要重新发布缓存等所有受影响的页面,以便更新并正确填充新值。

使用10,000多个文档,对所有内容进行完全重新发布可能会非常慢。

您还可以尝试更新cmsContentXml表中每个页面的XML以获得正确的值,然后重建站点的检查索引,这应该可以解决问题并且更快一些。这是因为此表的内容用于重建索引以节省速度。

另一种选择是编写一个API控制器任务,你可以运行一次,然后删除以使用Umbraco服务更新所有值,但同样,这将是非常慢的我想你正在谈论的页面量。

© www.soinside.com 2019 - 2024. All rights reserved.