我计划重命名我的一种自定义内容类型,以便我可以为我正在处理的新 Orchard 模块释放它的名称。我希望按照这个SO答案的建议在迁移类中使用Schema.ExecuteSql,但我想确保我知道我需要做的所有更新。
到目前为止,我知道我需要更新下表中的字段:
- Orchard_Framework_ContentTypeRecord
- Settings_ContentTypeDefinitionRecord
- Settings_ContentPartDefinitionRecord
另外,这是我需要运行的更新SQL的总体计划:
DECLARE @From VARCHAR(50) = 'OriginalName'
DECLARE @To VARCHAR(50) = 'NewName'
BEGIN TRANSACTION
BEGIN TRY
UPDATE [Current_Orchard_Framework_ContentTypeRecord]
SET [Name] = @To
WHERE [Name] = @From
UPDATE [Current_Settings_ContentTypeDefinitionRecord]
SET [Name] = @To, [DisplayName] = @To
WHERE [Name] = @From
UPDATE [dbo].[Current_Settings_ContentPartDefinitionRecord]
SET [Name] = @To + 'Part'
WHERE [Name] = @From + 'Part'
--COMMIT TRANSACTION
ROLLBACK TRANSACTION /*Rollback while testing*/
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
我是否缺少其他需要重命名以完全重命名我的内容类型的内容?
这可能不是您问题的确切答案,但是 - 尽管它具有轶事特征 - 它可能会帮助您找到解决方案。
我正在一个果园工作,那里有
- 很多页面
- 很多HTML链接到网站上的其他页面
- 导航中的许多自定义链接项(链接到目标页面中的某些锚点等)
在我们计划开发网站之前不久,出于SEO原因,决定将最突出页面的URL从http://www.example.org/orchard/products/category-name/product-name
更改为http://www.example.org/orchard/shop/category-name/product-name-keyword-anotherkeyword
(必须喜欢SEO...
手动执行此操作需要很长时间。更改内容项本身中的 URL 很容易(但在 ~20 个项目上执行此操作仍然需要一些时间),但更改所有 120+ 内容项中的所有<a href
,以及 5 个导航(5 种语言)中的所有自定义链接根本不可能。
因此,唯一可行的方法似乎是数据库操作。
我使用 MS SQL Server Management Studio
将 Orchard 数据库中的所有表导出到单个.sql文件。然后我使用 Notepad++
搜索包含部分字符串/products/category/product-name
的所有文件,并记下表名和字段名(通常为 Text
或 Data
)
在本例中,结果如下表所示:
- Common_BodyPartRecord.表
- Orchard_Framework_ContentItemRecord
- Orchard_Framework_ContentItemVersionRecord
要在 SQl 中search-replace
部分字符串,请使用 replace
函数,并且由于表字段的数据类型,果园存储数据,您必须强制转换字符串。生成的 SQL 查询如下所示:
update [Orchard_Live].[dbo].[Common_BodyPartRecord]
set Text = cast(replace(cast(Text as nvarchar(max)), N'/products/category/product-name', N'/shop/category-name/product-name-keyword-anotherkeyword') as ntext)
where cast(Text as nvarchar(max)) LIKE N'%/products/category/product-name%'
update [Orchard_Live].[dbo].[Orchard_Framework_ContentItemRecord]
set Data = cast(replace(cast(Data as nvarchar(max)), N'/products/category/product-name', N'/shop/category-name/product-name-keyword-anotherkeyword') as ntext)
where cast(Data as nvarchar(max)) LIKE N'%/products/category/product-name%'
update [Orchard_Live].[dbo].[Orchard_Framework_ContentItemVersionRecord]
set Data = cast(replace(cast(Data as nvarchar(max)), N'/products/category/product-name', N'/shop/category-name/product-name-keyword-anotherkeyword') as ntext)
where cast(Data as nvarchar(max)) LIKE N'%/products/category/product-name%'
我必须为每个必须更改的 URL 执行此操作。花了相当长的时间,但到目前为止仍然击败了手动更改所有内容。也许这个"工作流程"也可以帮助你解决问题。