Orchardcms 如何从Orchard中的后台任务更新内容项(草稿)?

Orchardcms 如何从Orchard中的后台任务更新内容项(草稿)?,orchardcms,background-process,Orchardcms,Background Process,我有一个简单的IBackgroundTask实现,它执行查询,然后根据特定项是否存在执行插入或一个或多个更新。然而,这些更新并没有持久化,我不明白为什么。新项目按预期创建 我正在更新的内容项有一个公用部分,我已尝试作为有效用户进行身份验证。我还尝试在Sweep方法的末尾刷新内容管理器。我错过了什么 这是我的扫描,为简洁起见略加编辑: public void Sweep() { // Authenticate as the site's super user var superUs

我有一个简单的
IBackgroundTask
实现,它执行查询,然后根据特定项是否存在执行插入或一个或多个更新。然而,这些更新并没有持久化,我不明白为什么。新项目按预期创建

我正在更新的内容项有一个
公用部分
,我已尝试作为有效用户进行身份验证。我还尝试在
Sweep
方法的末尾刷新内容管理器。我错过了什么

这是我的
扫描
,为简洁起见略加编辑:

public void Sweep()
{
    // Authenticate as the site's super user
    var superUser = _membershipService.GetUser(_orchardServices.WorkContext.CurrentSite.SuperUser);
    _authenticationService.SetAuthenticatedUserForRequest(superUser);

    // Create a dummy "Person" content item
    var item = _contentManager.New("Person");
    var person = item.As<PersonPart>();
    if (person == null)
    {
        return;
    }
    person.ExternalId = Random.Next(1, 10).ToString();
    person.FirstName = GenerateFirstName();
    person.LastName = GenerateLastName();

    // Check if the person already exists
    var matchingPersons = _contentManager
        .Query<PersonPart, PersonRecord>(VersionOptions.AllVersions)
        .Where(record => record.ExternalId == person.ExternalId)
        .List().ToArray();
    if (!matchingPersons.Any())
    {
        // Insert new person and quit
        _contentManager.Create(item, VersionOptions.Draft);
        return;
    }

    // There are at least one matching person, update it
    foreach (var updatedPerson in matchingPersons)
    {
        updatedPerson.FirstName = person.FirstName;
        updatedPerson.LastName = person.LastName;
    }

    _contentManager.Flush();
}
public void Sweep()
{
//作为站点的超级用户进行身份验证
var superUser=\u membershipService.GetUser(\u orchardServices.WorkContext.CurrentSite.superUser);
_authenticationService.SetAuthenticatedUserForRequest(超级用户);
//创建一个虚拟的“Person”内容项
风险值项目=_contentManager.New(“人员”);
var person=item.As();
if(person==null)
{
返回;
}
person.ExternalId=Random.Next(1,10).ToString();
person.FirstName=GenerateFirstName();
person.LastName=GenerateLastName();
//检查此人是否已经存在
var matchingPersons=\u contentManager
.Query(VersionOptions.AllVersions)
.Where(record=>record.ExternalId==person.ExternalId)
.List().ToArray();
如果(!matchingPersons.Any())
{
//插入新人并退出
_创建(item,VersionOptions.Draft);
返回;
}
//至少有一个匹配的人,请更新它
foreach(matchingPersons中的var updatedPerson)
{
updatedPerson.FirstName=person.FirstName;
updatedPerson.LastName=person.LastName;
}
_contentManager.Flush();
}

尝试添加
\u contentManager.Publish(updatedPerson)
。如果您不想发布,只想保存,则无需执行更多操作,因为Orchard中的更改将自动保存,除非中止环境事务。根本不需要调用
Flush
。无论是在常规请求期间还是在后台任务中都是如此。

app_data\logs中有任何异常吗?没有。此日期有一个错误.log文件,但它是空的。那么它应该可以正常工作,不需要刷新。相同的代码是否在常规控制器中工作,而不是在后台任务中工作?好吧,我现在觉得自己像个白痴——我发布的代码工作正常。在我的实际程序中,模型有更多属性,其中一些属性没有在后台任务中设置。当我检查更新是否被持久化时,恰好看到了这些属性。。。我忘记了注释掉的代码。严格来说,contentManager.Publish()与问题无关(因为没有问题)。我很感激你花时间回答。如果我可以给你一个用户投票,我会的,但我不会把这篇文章作为一个答案。我用我在评论中提供的其他元素更新了我的答案:答案可能不是你期望的,但评论确实给了你问题的解决方案。