/// <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); }