海量页面的数据迁移

Data migration for a huge amount of pages

我有一个包含 Field1SomeBlock

的基页
public abstract class BasePage : PageData
{
    [CultureSpecific]
    [Display(Name = "Field1")]
    public virtual string Field1 { get; set; }


    [Display(Name = "SomeBlock")]
    public virtual SomeBlock SomeBlock { get; set; }
}
public class SomeBlock : BlockData
{
    [CultureSpecific]
    [Display(Name = "Field1")]
    public virtual string Field1 { get; set; }
}

现在我必须将 Field1 移动到 BasePage 内的 SomeBlock 并移动所有现有数据从 BasePage.Field1BasePage.SomeBlock.Field1

为此,我创建了一个如下所示的作业:

    private void MigrateFields()
    {
        var repo = ServiceLocator.Current.GetInstance<IContentRepository>();

        var descendents  = repo.GetDescendents(_root).Where(p => SafeGetContent(repo, p) is BasePage).Select(repo.Get<BasePage>);

        foreach (var basePage in descendents)
        {

            BasePage writeablePage = (BasePage)basePage .CreateWritableClone();

            if (basePage.SomeBlock == null)
                basePage.SomeBlock = new SomeBlock ();

            if (string.IsNullOrWhiteSpace(basePage.SomeBlock.Field1))
            {
                basePage.SomeBlock.Field1 = basePage.Field1;
            }


            DataFactory.Instance.Save(writeablePage, SaveAction.Publish, AccessLevel.NoAccess);
        }
    }

如果我有大约 1000 页,一切正常。但是,如果该站点有 >20000,则工作似乎就此结束。

看起来您正在使用 GetSafeContent 对每个页面执行两次 Get 到数据库,然后再执行 Get。您可以从执行单个 Get 开始,然后检查正确的类型。

有问题
var descendents  = repo.GetDescendents(_root)
.Where(p => SafeGetContent(repo, p) is BasePage).Select(repo.Get<BasePage>);

它不适用于大量页面。这种代码更适合这个问题:

var references = DataFactory.Instance.GetDescendents(RootPageReference);
var pages = DataFactory.Instance.GetItems(references,
LanguageSelector.AutoDetect()).Where(x => !x.IsDeleted).OfType<BasePage>();