/// <summary>
        /// Get EdmModel
        /// </summary>
        /// <returns><see cref="IEdmModel"/></returns>
        public virtual IEdmModel GetEdmModel()
        {
            var serviceContext = Dependencies.GetServiceContext();
            var website        = Dependencies.GetWebsite();
            var model          = new EdmModel();
            var container      = new EdmEntityContainer(NamespaceName, ContainerName);

            model.AddElement(container);
            model.SetIsDefaultEntityContainer(container, true);

            var entitylists = GetEntityLists(website);

            if (!entitylists.Any())
            {
                return(model);
            }

            var entityReferenceType = new EdmComplexType(NamespaceName, "EntityReference");

            entityReferenceType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Guid);
            entityReferenceType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String);

            var picklistType = new EdmComplexType(NamespaceName, "OptionSet");

            picklistType.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String);
            picklistType.AddStructuralProperty("Value", EdmPrimitiveTypeKind.Int32);

            model.AddElement(entityReferenceType);
            model.AddElement(picklistType);

            var entitySetNames = new List <string>();

            foreach (var entitylist in entitylists)
            {
                var entityListId             = entitylist.GetAttributeValue <Guid>("adx_entitylistid");
                var entityListEntityName     = entitylist.GetAttributeValue <string>("adx_entityname");
                var entityListEntityTypeName = entitylist.GetAttributeValue <string>("adx_odata_entitytypename");
                var entityListEntitySetName  = entitylist.GetAttributeValue <string>("adx_odata_entitysetname");
                var entityTypeName           = string.IsNullOrWhiteSpace(entityListEntityTypeName) ? entityListEntityName : entityListEntityTypeName;
                var entitySetName            = string.IsNullOrWhiteSpace(entityListEntitySetName) ? entityListEntityName : entityListEntitySetName;
                var entityPermissionsEnabled = entitylist.GetAttributeValue <bool>("adx_entitypermissionsenabled");
                if (entitySetNames.Contains(entitySetName))
                {
                    ADXTrace.Instance.TraceError(TraceCategory.Application, string.Format(string.Format("An Entity Set has already been defined with the name '{0}'. Entity Set could not added to the model. You must not have multiple Entity List records with OData enabled and the same Entity Name specified, otherwise specifiy a unique Entity Set Name and Entity Type Name in the Entity List's OData Settings in CRM.", entitySetName)));
                    continue;
                }
                entitySetNames.Add(entitySetName);
                var entityType   = new EdmEntityType(NamespaceName, entityTypeName);
                var viewIdString = entitylist.GetAttributeValue <string>("adx_odata_view");

                if (string.IsNullOrWhiteSpace(viewIdString))
                {
                    continue;
                }

                Guid viewId;

                Guid.TryParse(viewIdString, out viewId);

                var savedQuery = GetSavedQuery(viewId);

                var view = new SavedQueryView(serviceContext, savedQuery, LanguageCode);

                var columns = view.Columns;

                var key = entityType.AddStructuralProperty(view.PrimaryKeyLogicalName, EdmPrimitiveTypeKind.Guid);
                entityType.AddKeys(key);

                foreach (var column in columns)
                {
                    var attributeMetadata = column.Metadata;
                    var propertyName      = column.LogicalName;
                    if (propertyName.Contains('.'))
                    {
                        propertyName = string.Format("{0}-{1}", column.Metadata.EntityLogicalName, column.Metadata.LogicalName);
                    }
                    var edmPrimitiveTypeKind = MetadataHelpers.GetEdmPrimitiveTypeKindFromAttributeMetadata(attributeMetadata);
                    if (edmPrimitiveTypeKind != null)
                    {
                        entityType.AddStructuralProperty(propertyName, edmPrimitiveTypeKind.GetValueOrDefault(EdmPrimitiveTypeKind.None));
                    }
                    else
                    {
                        switch (attributeMetadata.AttributeType)
                        {
                        case AttributeTypeCode.Customer:
                        case AttributeTypeCode.Lookup:
                        case AttributeTypeCode.Owner:
                            entityType.AddStructuralProperty(propertyName, new EdmComplexTypeReference(entityReferenceType, true));
                            break;

                        case AttributeTypeCode.Picklist:
                        case AttributeTypeCode.State:
                        case AttributeTypeCode.Status:
                            entityType.AddStructuralProperty(propertyName, new EdmComplexTypeReference(picklistType, true));
                            break;
                        }
                    }
                }

                entityType.AddProperty(new EdmStructuralProperty(entityType, "list-id", EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, true), entityListId.ToString(), EdmConcurrencyMode.None));
                entityType.AddProperty(new EdmStructuralProperty(entityType, "view-id", EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, true), viewId.ToString(), EdmConcurrencyMode.None));
                entityType.AddProperty(new EdmStructuralProperty(entityType, "entity-permissions-enabled", EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, true), entityPermissionsEnabled.ToString(), EdmConcurrencyMode.None));

                model.AddElement(entityType);
                container.AddEntitySet(entitySetName, entityType);
            }

            return(model);
        }