如何删除Orchard中某个内容项的版本记录?
How to delete version records of a content item in Orchard?
我有一个与用户同步相关的 Orchard CMS 运行。此同步会在一夜之间更新每个用户,代码以
开头
... = mContentManager.Get<Orchard.Users.Models.UserPart>(lOrchardUser.ContentItem.Id,
Orchard.ContentManagement.VersionOptions.DraftRequired);
如您所见,VersionOptions.DraftRequired
被传递给 Get()
方法,并在每次同步用户时创建一个新草稿。它不打算在这里创建一个新的草稿,所以我将其更改为 VersionOptions.Published
这避免了在每次调用时创建一个新的版本记录。
但这里的问题是过去 VersionOptions.DraftRequired
为每个用户创建了大约 120 个版本记录,而数据库中大约有 1000 个用户。
当我现在使用 IContentManager.Query()
时,由于版本数量多,需要相当长的时间。
我的想法是删除除已发布版本之外的所有版本,因为我不需要它们,但 IContentManager
不提供任何版本删除选项,使用 IRepository<>
删除记录会导致NHibernate 异常。
所以我最后的办法是使用 LINQ 查询来删除版本,这确实有效,但我被告知不建议在 Orchard 中使用 LINQ。
不知道有没有人遇到过大量版本记录的问题,因为系统运行的时间越长,积累的数据越多,系统越来越慢。
那么,我的问题是
- Orchard 有没有删除版本记录的方法?
- 有没有办法禁用版本控制?
由于似乎没有 Orchard 方法可以做到这一点,我删除了具有以下 LINQ 2 SQL 代码的版本:
public System.Web.Mvc.ActionResult RemoveVersions()
{
// select user ids, an alternate way is to retrieve user IDs via content manager but this takes a veeeeery long time due
// to the need of querying all versions
//
// var lOrchardUserIDs = mContentManager
// .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
// .List()
// .Select(u => u.Id)
// .ToList()
var lOrchardUserIDs = mUserRepository.Fetch(u => true).Select(u => u.Id).ToList();
foreach (var lOrchardUserID in lOrchardUserIDs)
{
var lContentItemVersionRecords =
(from r in DataContext.ContentItemVersionRecords where r.ContentItemRecord_id == lOrchardUserID select r).ToList();
if (lContentItemVersionRecords.Count > 1)
{
foreach (var lContentItemVersionRecord in lContentItemVersionRecords)
{
if (lContentItemVersionRecord.Number == 1)
{
if (lContentItemVersionRecords[lContentItemVersionRecords.Count - 1].Published)
{
lContentItemVersionRecord.Latest = true;
lContentItemVersionRecord.Published = true;
}
}
else
DataContext.ContentItemVersionRecords.DeleteOnSubmit(lContentItemVersionRecord);
}
}
}
DataContext.SubmitChanges();
return Content("Done");
}
我有一个与用户同步相关的 Orchard CMS 运行。此同步会在一夜之间更新每个用户,代码以
开头... = mContentManager.Get<Orchard.Users.Models.UserPart>(lOrchardUser.ContentItem.Id,
Orchard.ContentManagement.VersionOptions.DraftRequired);
如您所见,VersionOptions.DraftRequired
被传递给 Get()
方法,并在每次同步用户时创建一个新草稿。它不打算在这里创建一个新的草稿,所以我将其更改为 VersionOptions.Published
这避免了在每次调用时创建一个新的版本记录。
但这里的问题是过去 VersionOptions.DraftRequired
为每个用户创建了大约 120 个版本记录,而数据库中大约有 1000 个用户。
当我现在使用 IContentManager.Query()
时,由于版本数量多,需要相当长的时间。
我的想法是删除除已发布版本之外的所有版本,因为我不需要它们,但 IContentManager
不提供任何版本删除选项,使用 IRepository<>
删除记录会导致NHibernate 异常。
所以我最后的办法是使用 LINQ 查询来删除版本,这确实有效,但我被告知不建议在 Orchard 中使用 LINQ。
不知道有没有人遇到过大量版本记录的问题,因为系统运行的时间越长,积累的数据越多,系统越来越慢。
那么,我的问题是
- Orchard 有没有删除版本记录的方法?
- 有没有办法禁用版本控制?
由于似乎没有 Orchard 方法可以做到这一点,我删除了具有以下 LINQ 2 SQL 代码的版本:
public System.Web.Mvc.ActionResult RemoveVersions()
{
// select user ids, an alternate way is to retrieve user IDs via content manager but this takes a veeeeery long time due
// to the need of querying all versions
//
// var lOrchardUserIDs = mContentManager
// .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
// .List()
// .Select(u => u.Id)
// .ToList()
var lOrchardUserIDs = mUserRepository.Fetch(u => true).Select(u => u.Id).ToList();
foreach (var lOrchardUserID in lOrchardUserIDs)
{
var lContentItemVersionRecords =
(from r in DataContext.ContentItemVersionRecords where r.ContentItemRecord_id == lOrchardUserID select r).ToList();
if (lContentItemVersionRecords.Count > 1)
{
foreach (var lContentItemVersionRecord in lContentItemVersionRecords)
{
if (lContentItemVersionRecord.Number == 1)
{
if (lContentItemVersionRecords[lContentItemVersionRecords.Count - 1].Published)
{
lContentItemVersionRecord.Latest = true;
lContentItemVersionRecord.Published = true;
}
}
else
DataContext.ContentItemVersionRecords.DeleteOnSubmit(lContentItemVersionRecord);
}
}
}
DataContext.SubmitChanges();
return Content("Done");
}