1

我正在将 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();

此代码片段应该将AutoroutePartTitlePart分配给手头的类型(假设它是Page,但显然是 Routes 选项卡的复选框列表中的任何其他类型)。但它没有这样做。因为后来的任务

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

失败并且autoroutePart为空,然后代码Object reference not set...在尝试访问时失败并出现错误autoroutePart.ContentItem.Id

最终,我能够通过在表Settings_ContentTypePartDefinitionRecord中手动输入将页面(ContentType ID 2)映射到自动路由和标题部分 ID 的记录来绕过它,但这看起来很尴尬且容易出错,而且我一定错过了一些东西(更不用说不得不将此技巧应用于其余的内容类型)。

什么会导致AlterTypeDefinition无法在数据库中应用这些记录?

4

1 回答 1

0

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

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

提供差异作为要点。

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

于 2014-04-14T06:48:58.183 回答