C# Authorizer类中的Orchard上下文为Null

C# Authorizer类中的Orchard上下文为Null,c#,orchardcms,C#,Orchardcms,在授权人类的第72行,我得到一个空引用异常: if (_authorizationService.TryCheckAccess(permission, _workContextAccessor.GetContext().CurrentUser, content)) 问题在于GetContext()返回null,因此,显然,引用CurrentUser会给我带来问题 最初,它是一个迁移,创建分类术语,导致对授权者的调用。事实上,完整的堆栈跟踪可以在这篇文章下面找到 我已经尝试了重构迁移方面的所有方

授权人
类的第72行,我得到一个空引用异常:

if (_authorizationService.TryCheckAccess(permission, _workContextAccessor.GetContext().CurrentUser, content))
问题在于
GetContext()
返回
null
,因此,显然,引用
CurrentUser
会给我带来问题

最初,它是一个迁移,创建分类术语,导致对授权者的调用。事实上,完整的堆栈跟踪可以在这篇文章下面找到

我已经尝试了重构迁移方面的所有方法,但是代码中的其他地方已经被证明了3次(其中一次是在迁移中——因此我确信我所做的“上下文”是好的)

迁移代码:

        var taxonomy = _contentManager.New<TaxonomyPart>("Taxonomy");
        taxonomy.Name = "Categories";
        _contentManager.Create(taxonomy, VersionOptions.Published);

        var parentTerm = _taxonomyService.NewTerm(taxonomy);
        parentTerm.Name = "Products";
        parentTerm.Container = taxonomy.ContentItem;
        _contentManager.Create(parentTerm, VersionOptions.Published);
        string[] childTermNames = { "Disks", "Mice", "Keyboards" };

        foreach (var termName in childTermNames)
        {
            var term = _taxonomyService.NewTerm(taxonomy);
            term.Name = termName;
            term.Container = parentTerm.ContentItem;
            _contentManager.Create(term, VersionOptions.Published);
        }
2015-02-13 15:47:32,955 [23] Orchard.ContentManagement.DefaultContentManager - (null) - NullReferenceException thrown from IContentHandler by Orchard.Autoroute.Handlers.AutoroutePartHandler
System.NullReferenceException: Object reference not set to an instance of an object.
   at Orchard.Security.Authorizer.Authorize(Permission permission, IContent content, LocalizedString message) in \Site\src\Orchard\Security\Authorizer.cs:line 72
   at Orchard.Security.Authorizer.Authorize(Permission permission) in \Site\src\Orchard\Security\Authorizer.cs:line 60
   at Orchard.Autoroute.Handlers.AutoroutePartHandler.ProcessAlias(AutoroutePart part)
   at Orchard.Autoroute.Handlers.AutoroutePartHandler.PublishAlias(AutoroutePart part)
   at Orchard.Autoroute.Handlers.AutoroutePartHandler.<.ctor>b__2(PublishContentContext ctx, AutoroutePart part)
   at Orchard.ContentManagement.Handlers.ContentHandler.InlineStorageFilter`1.Published(PublishContentContext context, TPart instance) in Site\src\Orchard\ContentManagement\Handlers\ContentHandler.cs:line 164
   at Orchard.ContentManagement.Handlers.StorageFilterBase`1.Orchard.ContentManagement.Handlers.IContentStorageFilter.Published(PublishContentContext context) in Site\src\Orchard\ContentManagement\Handlers\StorageFilterBase.cs:line 87
   at Orchard.ContentManagement.Handlers.ContentHandler.Orchard.ContentManagement.Handlers.IContentHandler.Published(PublishContentContext context) in Site\src\Orchard\ContentManagement\Handlers\ContentHandler.cs:line 288
   at Orchard.ContentManagement.DefaultContentManager.<>c__DisplayClass5e.<Create>b__5b(IContentHandler handler) in \Site\src\Orchard\ContentManagement\DefaultContentManager.cs:line 534
   at Orchard.InvokeExtensions.Invoke[TEvents](IEnumerable`1 events, Action`1 dispatch, ILogger logger) in Site\src\Orchard\InvokeExtensions.cs:line 17

我和你有同样的问题,我通过查看TermAdminController找到了解决方案

以下是一个示例:

   var parentTerm = _taxonomyService.NewTerm(categoriesTaxonomy);
   parentTerm.Container = categoriesTaxonomy.ContentItem;

   // Create content item before updating so attached fields save correctly
   _orchardServices.ContentManager.Create(parentTerm, VersionOptions.Draft);
   parentTerm.Name = "main category";
   parentTerm.Selectable = true;

   _taxonomyService.ProcessPath(parentTerm);
   _orchardServices.ContentManager.Publish(parentTerm.ContentItem);

   var subTerm = _taxonomyService.NewTerm(categoriesTaxonomy);

   //here you set the parent term
   subTerm.Container = parentTerm == null ? categoriesTaxonomy.ContentItem : parentTerm.ContentItem;

   // Create content item before updating so attached fields save correctly
   _orchardServices.ContentManager.Create(subTerm, VersionOptions.Draft);
   subTerm.Name = "sub category";
   subTerm.Selectable = true;

   _taxonomyService.ProcessPath(subTerm);
   _orchardServices.ContentManager.Publish(subTerm.ContentItem);

希望有帮助

这看起来不像是属于迁移的代码:迁移用于更改DB模式和更改内容定义。你是否尝试从配方中做这项工作?我确实认为这可能是解决表格填充问题的错误部分,但我只是遵循果园文档,这确实做到了:在迁移过程中创建数据时,我应该期望果园抛出空引用异常吗?我以前做过很多次,一直都很好。在我尝试分配父项之前,这个内容创建代码本身是很好的。