如何删除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。

不知道有没有人遇到过大量版本记录的问题,因为系统运行的时间越长,积累的数据越多,系统越来越慢。

那么,我的问题是

  1. Orchard 有没有删除版本记录的方法?
  2. 有没有办法禁用版本控制?

由于似乎没有 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");
  }