/// <summary>
        /// Ensures the metadata is refreshed and uptodate and returns it.
        /// </summary>
        /// <param name="entityName"></param>
        /// <returns></returns>
        public CrmEntityMetadata RefreshEntityMetadata(string entityName)
        {
            bool isPresent = true;
            var  result    = _Metadata.GetOrAdd(entityName, p =>
            {
                isPresent    = false;
                var metadata = _repository.GetChanges(entityName, null);
                var entMeta  = metadata.EntityMetadata[0];
                var crment   = new CrmEntityMetadata()
                {
                    Attributes = entMeta.Attributes.ToList(),
                    EntityName = entityName,
                    Timestamp  = metadata.ServerVersionStamp
                };
                return(crment);
            });


            if (!isPresent)
            {
                // it wasn;t present in the cache, so return the result as its currently the latest.
                return(result);
            }
            // refresh the metadata
            // it was present in the cache, so get check for changes and update if required before returning.
            Debug.WriteLine("Refreshing metadata for entity: " + entityName, "Metadata");
            var changes = _repository.GetChanges(entityName, result.Timestamp);
            // update existing metadata..
            var latestEntityMetadata = changes.EntityMetadata[0];

            // Detect new / deleted fields.
            List <AttributeMetadata> modifiedFields = null;
            List <Guid> deletedFields = null;

            if (latestEntityMetadata.HasChanged.GetValueOrDefault())
            {
                modifiedFields = latestEntityMetadata.Attributes.Where(att => att.HasChanged.GetValueOrDefault()).ToList();
                deletedFields  = changes.DeletedMetadata != null &&
                                 changes.DeletedMetadata.ContainsKey(DeletedMetadataFilters.Attribute)
                                    ? changes.DeletedMetadata[DeletedMetadataFilters.Attribute].ToList()
                                    : null;
                // Work out what was changed..
                // var deletedFields = latestEntityMetadataResponse.DeletedMetadata.Where(att => att.HasChanged.GetValueOrDefault()).ToList();
            }

            // Loop through all metadata items, and add missing change units.
            bool hasSchemaChanges = (modifiedFields != null && modifiedFields.Any()) || (deletedFields != null && deletedFields.Any());

            if (hasSchemaChanges)
            {
                Debug.WriteLine("Updating metadata for entity: " + entityName, "Metadata");
                result.Refresh(modifiedFields, deletedFields);
            }

            return(result);
        }
        /// <summary>
        /// Returns the metadata for an entity.
        /// </summary>
        /// <param name="entityName"></param>
        /// <returns></returns>
        public CrmEntityMetadata GetEntityMetadata(string entityName)
        {
            var changes = _Metadata.GetOrAdd(entityName, p =>
            {
                Debug.WriteLine("Retrieving metadata for entity: " + entityName, "Metadata");
                var metadata = _repository.GetChanges(entityName, null);
                var entMeta  = metadata.EntityMetadata[0];
                var result   = new CrmEntityMetadata()
                {
                    Attributes = entMeta.Attributes.ToList(),
                    EntityName = entityName,
                    Timestamp  = metadata.ServerVersionStamp
                };
                return(result);
            });

            return(changes);
        }