我正在将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
不在数据库中应用这些记录?
答案 0 :(得分:0)
我能够通过使用新的交易系统来实现这一目标。
这个想法是在需要提交到数据库的每段代码之前和之后调用ITransactionManager.RequireNew()
。我的代码示例中的一些调用是多余的,但我认为这段代码只会被使用一次,而不是尝试优化不需要的调用,我会留下来指示事务的开始和结束位置。
提供差异作为要点。