public static bool SynchronizeTo(this IStudentAcademicRecordExtension source, IStudentAcademicRecordExtension target)
        {
            bool isModified = false;

            var sourceSupport = source as IStudentAcademicRecordExtensionSynchronizationSourceSupport;

            var sourceExtensionSupport = source.StudentAcademicRecord as IExtensionsSynchronizationSourceSupport;

            if (!sourceExtensionSupport.IsExtensionAvailable("SampleStudentTranscript"))
            {
                return(false);
            }

            // Back synch non-reference portion of PK (PK properties cannot be changed, therefore they can be omitted in the resource payload, but we need them for proper comparisons for persistence)

            // Copy non-PK properties

            if ((sourceSupport == null || sourceSupport.IsNameOfInstitutionSupported) &&
                target.NameOfInstitution != source.NameOfInstitution)
            {
                target.NameOfInstitution = source.NameOfInstitution;
                isModified = true;
            }

            if ((sourceSupport == null || sourceSupport.IsSubmissionCertificationDescriptorSupported) &&
                target.SubmissionCertificationDescriptor != source.SubmissionCertificationDescriptor)
            {
                target.SubmissionCertificationDescriptor = source.SubmissionCertificationDescriptor;
                isModified = true;
            }


            // Sync lists

            return(isModified);
        }
        public static void MapTo(this IStudentAcademicRecordExtension source, IStudentAcademicRecordExtension target, Action <IStudentAcademicRecordExtension, IStudentAcademicRecordExtension> onMapped)
        {
            var sourceSynchSupport = source as IStudentAcademicRecordExtensionSynchronizationSourceSupport;
            var targetSynchSupport = target as IStudentAcademicRecordExtensionSynchronizationSourceSupport;

            // Copy contextual primary key values

            // Copy non-PK properties

            if (sourceSynchSupport.IsNameOfInstitutionSupported)
            {
                target.NameOfInstitution = source.NameOfInstitution;
            }
            else
            {
                targetSynchSupport.IsNameOfInstitutionSupported = false;
            }

            if (sourceSynchSupport.IsSubmissionCertificationDescriptorSupported)
            {
                target.SubmissionCertificationDescriptor = source.SubmissionCertificationDescriptor;
            }
            else
            {
                targetSynchSupport.IsSubmissionCertificationDescriptorSupported = false;
            }

            // Copy Aggregate Reference Data
            if (GeneratedArtifactStaticDependencies.AuthorizationContextProvider == null ||
                GeneratedArtifactStaticDependencies.AuthorizationContextProvider.GetAction() == RequestActions.ReadActionUri)
            {
                target.PostSecondaryOrganizationResourceId    = source.PostSecondaryOrganizationResourceId;
                target.PostSecondaryOrganizationDiscriminator = source.PostSecondaryOrganizationDiscriminator;
            }



            // ----------------------------------
            //   Map One-to-one relationships
            // ----------------------------------

            // Map lists


            var eTagProvider = new ETagProvider();

            // Convert value to ETag, if appropriate
            var entityWithETag = target as IHasETag;

            if (entityWithETag != null)
            {
                entityWithETag.ETag = eTagProvider.GetETag(source);
            }

            // Convert value to LastModifiedDate, if appropriate
            var dateVersionedEntity = target as IDateVersionedEntity;
            var etagSource          = source as IHasETag;

            if (dateVersionedEntity != null && etagSource != null)
            {
                dateVersionedEntity.LastModifiedDate = eTagProvider.GetDateTime(etagSource.ETag);
            }
        }