/// <summary>
        /// Saves the spatial and attribute data to a geodatabase.
        /// </summary>
        /// <param name="featureMemberElements">The root node of the feature element list</param>
        /// <param name="envelope"></param>
        public void SaveFeatureMembers(IEnumerable <XElement> featureMemberElements, IEnvelope envelope)
        {
            // ReSharper disable PossibleMultipleEnumeration

            if ((featureMemberElements != null) && featureMemberElements.Any())
            {
                if (FeatureClass == null)
                {
                    IMappedFeature feature = CreateMappedFeature(null);
                    XName          name    = feature.Name;

                    foreach (var featureMemberElement in featureMemberElements)
                    {
                        IEnumerable <XElement> mappedFeatureElements = featureMemberElement.Descendants(name);

                        foreach (var mappedFeatureElement in mappedFeatureElements)
                        {
                            CreateMappedFeature(mappedFeatureElement);
                        }
                    }

                    if (FeatureClass != null)
                    {
                        var featureLayer = _layer as FeatureLayer;

                        if (featureLayer != null)
                        {
                            featureLayer.FeatureClass = FeatureClass;
                        }
                    }
                }

                IMappedFeature    mapFeature          = CreateMappedFeature(null);
                var               fieldIds            = mapFeature.Fields.ToDictionary(field => FeatureClass.FindField(field.Key), field => field.Key);
                string            idField             = mapFeature.ObjectId;
                XName             objectName          = mapFeature.Name;
                IFeatureWorkspace featureWorkspace    = _cycloMediaGroupLayer.FeatureWorkspace;
                var               workspaceEdit       = featureWorkspace as IWorkspaceEdit;
                var               spatialCacheManager = featureWorkspace as ISpatialCacheManager3;

                if (workspaceEdit != null)
                {
                    var exists = new Dictionary <string, IFeature>();

                    if (FeatureClass != null)
                    {
                        ISpatialFilter spatialFilter = new SpatialFilterClass
                        {
                            Geometry      = envelope,
                            GeometryField = FeatureClass.ShapeFieldName,
                            SpatialRel    = esriSpatialRelEnum.esriSpatialRelContains,
                            SubFields     = idField
                        };

                        workspaceEdit.StartEditing(false);
                        var existsResult = FeatureClass.Search(spatialFilter, false);
                        var existsCount  = FeatureClass.FeatureCount(spatialFilter);
                        var imId         = existsResult.FindField(idField);
                        // ReSharper disable UseIndexedProperty

                        for (int i = 0; i < existsCount; i++)
                        {
                            IFeature feature  = existsResult.NextFeature();
                            var      recValue = feature.get_Value(imId) as string;

                            if ((recValue != null) && (!exists.ContainsKey(recValue)))
                            {
                                exists.Add(recValue, feature);
                            }
                        }
                    }

                    if (FeatureClass != null)
                    {
                        foreach (XElement featureMemberElement in featureMemberElements)
                        {
                            IEnumerable <XElement> mappedFeatureElements = featureMemberElement.Descendants(objectName);

                            foreach (var mappedFeatureElement in mappedFeatureElements)
                            {
                                IMappedFeature mappedFeature = CreateMappedFeature(mappedFeatureElement);

                                if (mappedFeature.Shape != null)
                                {
                                    if (mappedFeature.Shape.Type == ShapeType.Point)
                                    {
                                        if (!exists.ContainsKey((string)mappedFeature.FieldToItem(idField)))
                                        {
                                            var shapePoint = mappedFeature.Shape as ShapePoint;

                                            if ((shapePoint != null) && Filter(mappedFeature))
                                            {
                                                IPoint point = new Point();
                                                point.PutCoords(shapePoint.X, shapePoint.Y);
                                                IFeature feature = FeatureClass.CreateFeature();
                                                feature.Shape = point;

                                                foreach (var fieldId in fieldIds)
                                                {
                                                    feature.set_Value(fieldId.Key, mappedFeature.FieldToItem(fieldId.Value));
                                                }

                                                feature.Store();
                                            }
                                        }
                                        else
                                        {
                                            if (Filter(mappedFeature))
                                            {
                                                exists.Remove((string)mappedFeature.FieldToItem(idField));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    foreach (var feature in exists)
                    {
                        feature.Value.Delete();
                    }

                    workspaceEdit.StopEditing(true);

                    if ((spatialCacheManager != null) && (envelope != null))
                    {
                        spatialCacheManager.FillCache(envelope);
                    }
                    // ReSharper restore UseIndexedProperty
                }
            }

            // ReSharper restore PossibleMultipleEnumeration
        }