从Orchard 1.3.9升级到Orchard 1.7时,“迁移路由”失败

时间:2013-08-28 00:58:11

标签: orchardcms orchardcms-1.7

我正在将Orchard网站从1.3.9升级到1.7。

我正在使用升级模块,当尝试升级路由(最后一个标签页)时,代码会在尝试访问新创建的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)映射到Autoroute和Title部分ID,但这看起来很笨拙且容易出错,我必须要错过了一些东西(更不用说必须将这个黑客应用于其他内容类型)。

什么可能导致AlterTypeDefinition不在数据库中应用这些记录?

1 个答案:

答案 0 :(得分:0)

我能够通过使用新的交易系统来实现这一目标。

这个想法是在需要提交到数据库的每段代码之前和之后调用ITransactionManager.RequireNew()。我的代码示例中的一些调用是多余的,但我认为这段代码只会被使用一次,而不是尝试优化不需要的调用,我会留下来指示事务的开始和结束位置。

提供差异作为要点。

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