2013-08-28 2 views
1

Я занимаюсь обновлением сайта Orchard с 1.3.9 до 1.7.«Миграция маршрутов» сбой при обновлении с Orchard 1.3.9 до Orchard 1.7

Я использую модуль Upgrade, а при попытке обновления маршрутов (последняя вкладка) код выходит из строя, в тот момент, когда он пытается получить доступ к вновь созданной странице AutoroutePart.

В частности, внутри RouteController.IndexPOST():

// migrating parts 
_contentDefinitionManager.AlterTypeDefinition(contentType, 
    builder => builder 
     .WithPart("AutoroutePart") 
     .WithPart("TitlePart")); 

// force the first object to be reloaded in order to get a valid AutoroutePart 
_orchardServices.ContentManager.Clear(); 

Этот фрагмент кода должен назначить AutoroutePart и TitlePart к типу под рукой (скажем, это Page но, очевидно, любой другой тип в списке флажков на вкладке «Маршруты»). Но он этого не делает. Потому что позже по заданию

var autoroutePart = ((ContentItem)content).As<AutoroutePart>(); 

терпит неудачу и autoroutePart имеет нулевое значение, а затем дальше код не с Object reference not set... ошибки, когда он пытается получить доступ к autoroutePart.ContentItem.Id.

В конце концов я смог обойти его вручную, указав запись в таблице Settings_ContentTypePartDefinitionRecord, которая сопоставляет страницу (идентификатор ContentType ID 2) с идентификаторами автозапуска и идентификационной информацией, но это кажется неудобным и подверженным ошибкам, и я, должно быть, что-то пропустил (не говоря уже о необходимости применять этот хак к остальным типам контента).

Что может вызвать AlterTypeDefinition, чтобы не применять эти записи в базе данных?

+0

Болезненные, как это, вы можете попробовать перейти на 1.4 первым. –

+0

@BertrandLeRoy, если это так, кому-то, возможно, потребуется обновить инструкции по адресу http://docs.orchardproject.net/Documentation/Orchard-1-7-Release-Notes .... BTW благодарит за отличный продукт! –

+0

Это работает для большинства людей. Мне жаль, что это не для вас. –

ответ

0

Мне удалось заставить его работать, используя новую систему транзакций.

Идея состоит в том, что ITransactionManager.RequireNew() вызывается до и после каждого фрагмента кода, который должен быть привязан к базе данных. Некоторые из вызовов в моем примере кода являются избыточными, но я считаю, что этот код будет использоваться только один раз, вместо того чтобы пытаться оптимизировать ненужные вызовы, я бы оставил их, чтобы указать, где начинаются и заканчиваются транзакции.

Предоставление разницы как сущность.

https://gist.github.com/harmony7/10621982