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()与问题无关(因为没有问题)。我很感激你花时间回答。如果我可以给你一个用户投票,我会的,但我不会把这篇文章作为一个答案。我用我在评论中提供的其他元素更新了我的答案:答案可能不是你期望的,但评论确实给了你问题的解决方案。