2015-01-30 2 views
2

Я планирую переименовать один из моих пользовательских типов контента, чтобы я мог освободить его имя для нового модуля Orchard, над которым я работаю. Я надеюсь использовать Schema.ExecuteSql в классе миграции, как предложено by this SO answer, но я хочу убедиться, что знаю все обновления, которые мне нужно будет сделать.Sql to Rename Orchard Custom Content Type

До сих пор, я понимаю, что мне нужно обновить поля в следующих таблицах:

  • 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 

Есть ли что-нибудь еще, что мне не хватает, что нужно будет переименовать, чтобы полностью переименовать мой тип контента?

+0

Действительно ли это необходимо? Это звучит опасно. Вы всегда можете изменить отображаемое имя типа контента – Hazza

+0

Я планирую использовать мой новый плагин для нескольких моих сайтов и хочу, чтобы тип контента стал тем, который я использую в будущем. По этой причине я не хочу переименовывать его в своей новой версии. – bingles

+0

Выглядит хорошо. Вы попробовали? –

ответ

0

Это не может быть точным ответом на вашу проблему, но, хотя у нее есть аннотированный характер, это может помочь вам найти решение.

Я работал на Орчард-сайте, который был

  • много страниц
  • много HTML ссылки на другие страницы сайта
  • много элементов пользовательских ссылок в навигациях (для привязки к определенным якорям внутри целевой страницы и т. д.)

Незадолго до того, как мы планировали delpoy на веб-сайте, было решено изменить URL-адреса наиболее известных страниц по причинам SEO от http://www.example.org/orchard/products/category-name/product-name до http://www.example.org/orchard/shop/category-name/product-name-keyword-anotherkeyword (gotta love SEO ...)

Выполнение этого вручную потребовало бы возраста. Изменение URL-адреса в самом элементе контента было бы простым (но выполнение этого на ~ 20 элементах все равно потребовалось бы некоторое время), но изменение всех этих <a href s во всех 120+ элементах контента и все пользовательские ссылки в 5 навигационных (5 языков) было бы просто невозможно.

Таким образом, единственным осуществимым способом, казалось, была манипуляция с базами данных.

Я использовал MS SQL Server Management Studio для экспорта всех таблиц в базе данных Orchard в отдельные .sql-файлы. Затем я использовал Notepad++ для поиска всех файлов, содержащих частичную строка /products/category/product-name и записывал имена таблицы и имя поля (обычно Text или Data)

В этом случае результаты были в следующих таблицах:

  • Common_BodyPartRecord.Таблица
  • Orchard_Framework_ContentItemRecord
  • Orchard_Framework_ContentItemVersionRecord

Чтобы search-replace частичная строка в SQl использовать функцию 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-адреса, который необходимо изменить. Взял довольно долгое время, но все равно бил вручную, меняя все на многое. Возможно, этот «рабочий процесс» также может помочь с вашей проблемой.