Publishing from code doesn't update references

Member since: 2005
 

Hi there!

I have a fairly straght forward code that replaces all references to page A with reference to page B in an Episerver 11 solution. The code below is simplified.

First I loop through all references with reference to page A

_repository.GetReferencesToContent(new ContentReference(pageA_id), true)

Then I fetch the original page in correct language, create clone, alter and save.

var original = _repository.Get(new ContentReference(referencePage_id), new CultureInfo(referencePage_lang));
var clone = (ContentData)original.CreateWritableClone();
clone["RelatedPage"] = new PageReference(pageB_id);
_repository.Save((IContent)clone, SaveAction.Publish, AccessLevel.NoAccess);

All of this works. Referenced page is published and now has reference to page B. However, if I try to delete page A or run GetReferencesToContent again I will still get that Refrences page has a reference to page A. If I in Edit mode alter the referenced page and publish, the reference will finally update correctly and reference to page A is finally gone. 

Am I missing something in my code that updates the references? I thought this was done by Episerver automatically when I do a Publish from code!?

#196844 Edited, Sep 13, 2018 9:46
  • Member since: 2015
     

    I encountered a similar issue to this which, for me, turned out to be down to the save action.  In addition to publish, I needed additional actions to force the new page.

    clone["RelatedPage"] = new PageReference(pageB_id);
    var saveAction = SaveAction.CheckIn | SaveAction.Publish | SaveAction.ForceNewVersion;
    _repository.Save((IContent)clone, saveAction, AccessLevel.NoAccess);

    #196896 Sep 14, 2018 15:21
  • This message was deleted by Goran Solomonovic at Sep 19, 2018 9:36.
  • Member since: 2005
     

    I'm afraid that didn't work Darren.

    References are still there. When I try to delete the old page it still shows references in other pages that I know don't have reference to old page. When I manually publish these in Edit mode the reference is removed.

    #196989 Sep 19, 2018 9:36
  • Member since: 2005
     

    I would think it's correct that old versions linking to a page would still be kept as references to content. But if it works when you publish manually I guess it's not.

    Could also have something to do with other language versions of the content.

    Maybe you need to touch the mark as changed property?

    clone["PageChangedOnPublish"] = true;

    #196996 Sep 19, 2018 11:25
  • Member since: 2005
     

    I'm afraid that didn't work either. References are still there. I'm actually already editing pages in the language that contains the reference so I believe I got that part correct at least. 

    #197000 Sep 19, 2018 12:12
  • Member since: 2005
     

    Yes, that did it for me Johan. I created a method that updates all the softlinks and it worked. However, ContentSoftLinkIndexer is unsupported internal API. So use it carefully and at your own risk. It might change without notice. So do test it after Episerver upgrade.

    public void UpdateSoftLinks(List<ReferenceInformation> referenceList)
    {
    	foreach (var reference in referenceList)
    	{
    		var content = _repository.Get<IContent>(reference.OwnerID, reference.OwnerLanguage);
    		var links = _contentSoftLinkIndexer.GetLinks(content);
    		_contentSoftLinkRepository.Save(content.ContentLink.ToReferenceWithoutVersion(), content is ILocalizable ? reference.OwnerLanguage : null, links, false);
    	}
    }

    #197020 Edited, Sep 19, 2018 14:47
  •  

    For me this was not working but i managed to manually change the reference to the new page by adding the following code: 

    foreach (SoftLink link in links)
                {
                    if (link.ReferencedContentLink == oldPage.ContentLink)
                        link.ReferencedContentLink = newPage.ContentLink;
                }

    Thank you guys. 

    #197022 Sep 19, 2018 15:05
  • Member since: 2005
     

    What you want is to trigger softlink save, not replace it manually. If pages are still showing among references you might also have missed replacing some of the old page references.

    #197025 Sep 19, 2018 15:20
  •  

    In the meantime I made it work as it should. Now the softlink save is triggered. The manual update was a backup solution.

    #197056 Sep 20, 2018 11:37