用于重命名 Orchard 自定义内容类型的 Sql



我计划重命名我的一种自定义内容类型,以便我可以为我正在处理的新 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的所有文件,并记下表名和字段名(通常为 TextData

在本例中,结果如下表所示:

  • 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 执行此操作。花了相当长的时间,但到目前为止仍然击败了手动更改所有内容。也许这个"工作流程"也可以帮助你解决问题。

最新更新