如何在Orchard中删除内容项的版本记录?

时间:2016-02-18 15:51:10

标签: c# nhibernate version orchardcms

我运行的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. 有没有办法禁用版本控制?

1 个答案:

答案 0 :(得分:1)

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