2016-04-18 3 views
1

Ich habe eine Basisseite mit dem Field1 und SomeBlockDatenmigration für eine riesige Menge an Seiten

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; } 
} 

Jetzt muss ich die Field1 in SomeBlock innerhalb des Basepage bewegen und verschiebt alle vorhandenen Daten von BasePage.Field1 zu BasePage.SomeBlock.Field1

Zu diesem Zweck es Ich habe einen Job erstellt, der wie folgt aussieht:

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); 
     } 
    } 

Alles funktioniert gut, wenn ich etwa 1000 Seiten habe. Wenn die Site jedoch> 20000 hat, scheint der Job einfach zu sterben.

+1

Sie könnten auch in * Migrationsschritte * sehen, sie werden häufig verwendet, wenn Eigenschaften geändert/umbenannt werden. –

+1

Danke @TedNyberg, ich werde versuchen –

+1

@TedNyberg Wie ich aus der Dokumentation sehen kann - ich könnte nur die Eigenschaft oder den Inhaltstyp umbenennen. Aber hier sollte ich Property auf den Block –

Antwort

2

Es gibt ein Problem mit

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

Es ist nicht mit einer riesigen Menge von Seiten funktioniert. Diese Art von Code passt viel besser für dieses Problem:

1

Sieht so aus, als ob Sie mit GetSafeContent zweimal in die Datenbank für jede Seite gehen und dann danach holen. Sie könnten damit beginnen, ein einzelnes Get zu machen und dann nach dem richtigen Typ zu suchen.

+0

Danke für Ihre Antwort. Ich glaube jedoch nicht, dass es in diesem Fall helfen würde. Brauche mehr Verbesserungen ... –