海量页面的数据迁移
Data migration for a huge amount of pages
我有一个包含 Field1 和 SomeBlock
的基页
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.Field1
到 BasePage.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>();
我有一个包含 Field1 和 SomeBlock
的基页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.Field1
到 BasePage.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>();