Private/Get-CorrectGuidForMTORelationship.ps1

Function Get-CorrectGuidForMTORelationship {
    param
    (
        [SolutionComponent]$Component,
        [guid]$ParentObjectId,
        [Hashtable]$Metadata
    )
    

    $ObjectId = $Component.ObjectId
    $type = Get-RelationshipType -Metadata $Metadata.Source.All -SolutionComponent $component -EntityObjectId $Component.parentObjectId

    switch ($type) {
        'ManyToOneRelationship' { 
            $entityLogicalName = ($metadata.Source.All[$Component.parentObjectId].ManyToOneRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).EntityLogicalName

            $ReferencePropertyName = ($metadata.Source.All[$Component.parentObjectId].ManyToOneRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).ReferencedEntityNavigationPropertyName

            $targetMetadataId = ($metadata.Target.All[$Component.parentObjectId].ManyToOneRelationships | 
                    Where-Object -Property ReferencedEntityNavigationPropertyName -eq $ReferencePropertyName).Metadataid
        }
        'OneToManyRelationship' {
            $entityLogicalName = ($metadata.Source.All[$Component.parentObjectId].OneToManyRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).EntityLogicalName

            $ReferencePropertyName = ($metadata.Source.All[$Component.parentObjectId].OneToManyRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).ReferencedEntityNavigationPropertyName

            $targetMetadataId = ($metadata.Target.All[$Component.parentObjectId].OneToManyRelationships | 
                    Where-Object -Property ReferencedEntityNavigationPropertyName -eq $ReferencePropertyName).Metadataid

        }
        'ManyToManyRelationship' {
            $entityLogicalName = ($metadata.Source.All[$Component.parentObjectId].ManyToManyRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).EntityLogicalName

            $ReferencePropertyName = ($metadata.Source.All[$Component.parentObjectId].ManyToManyRelationships | 
                    Where-Object -Property MetadataId -eq $ObjectId).ReferencedEntityNavigationPropertyName

            $targetMetadataId = ($metadata.Target.All[$Component.parentObjectId].ManyToManyRelationships | 
                    Where-Object -Property ReferencedEntityNavigationPropertyName -eq $ReferencePropertyName).Metadataid
        }
    }

    if ($targetMetadataId -and ($targetMetadataId -ne $ObjectId)) {
        $component.OriginalObjectId = $component.ObjectId
        $component.ObjectId = $targetMetadataId
        Write-Verbose ("Set objectid {0} to target metadataid {1} for relationship {2} on Entity {3} " -f $ObjectId, $targetMetadataId, $ReferencePropertyName, $entityLogicalName)
    }

    Write-Output $Component
}