private static void UpdateMinMaxValues(AttributeMetadata attribute, MappingField result) { if (attribute is StringAttributeMetadata) { var attr = attribute as StringAttributeMetadata; result.MaxLength = attr.MaxLength ?? result.MaxLength; } if (attribute is MemoAttributeMetadata) { var attr = attribute as MemoAttributeMetadata; result.MaxLength = attr.MaxLength ?? result.MaxLength; } if (attribute is IntegerAttributeMetadata) { var attr = attribute as IntegerAttributeMetadata; result.Min = attr.MinValue ?? result.Min; result.Max = attr.MaxValue ?? result.Max; } if (attribute is DecimalAttributeMetadata) { var attr = attribute as DecimalAttributeMetadata; result.Min = attr.MinValue ?? result.Min; result.Max = attr.MaxValue ?? result.Max; } if (attribute is MoneyAttributeMetadata) { var attr = attribute as MoneyAttributeMetadata; result.Min = attr.MinValue != null ? (decimal)attr.MinValue.Value : result.Min; result.Max = attr.MaxValue != null ? (decimal)attr.MaxValue.Value : result.Max; } if (attribute is DoubleAttributeMetadata) { var attr = attribute as DoubleAttributeMetadata; result.Min = attr.MinValue != null ? (decimal)attr.MinValue.Value : result.Min; result.Max = attr.MaxValue != null ? (decimal)attr.MaxValue.Value : result.Max; } }
public static void UpdateCache(List <AttributeMetadata> attributeMetadataList, MappingEntity mappingEntity) { // update modified fields var modifiedFields = mappingEntity.Fields.Where(field => attributeMetadataList.Exists(attMeta => attMeta.MetadataId == field.MetadataId)) .ToList(); modifiedFields.ForEach( field => UpdateMappingField(attributeMetadataList.First(attMeta => attMeta.MetadataId == field.MetadataId), field)); // add new attributes var newAttributes = attributeMetadataList.Where( attMeta => !Array.Exists(mappingEntity.Fields, field => field.MetadataId == attMeta.MetadataId)).ToList(); newAttributes.ForEach( attMeta => { var newFields = new MappingField[mappingEntity.Fields.Length + 1]; Array.Copy(mappingEntity.Fields, newFields, mappingEntity.Fields.Length); mappingEntity.Fields = newFields; mappingEntity.Fields[mappingEntity.Fields.Length - 1] = GetMappingField(attMeta, mappingEntity); }); }
private static void AddEntityImageCrm2013(List <MappingField> fields) { if (!fields.Any(f => f.DisplayName.Equals("EntityImageId"))) { return; } var image = new MappingField { Attribute = new CrmPropertyAttribute { IsLookup = false, LogicalName = "entityimage", IsEntityReferenceHelper = false }, SchemaName = "EntityImage", DisplayName = "EntityImage", HybridName = "EntityImage", TargetTypeForCrmSvcUtil = "byte[]", IsValidForUpdate = true, Description = "", // TODO there is an Description for this entityimage, Need to figure out how to read it from the server GetMethod = "" }; SafeAddField(fields, image); var imageTimestamp = new MappingField { Attribute = new CrmPropertyAttribute { IsLookup = false, LogicalName = "entityimage_timestamp", IsEntityReferenceHelper = false }, SchemaName = "EntityImage_Timestamp", DisplayName = "EntityImage_Timestamp", HybridName = "EntityImage_Timestamp", TargetTypeForCrmSvcUtil = "System.Nullable<long>", FieldType = AttributeTypeCode.BigInt, IsValidForUpdate = false, IsValidForCreate = false, Description = " ", // CrmSvcUtil provides an empty description for this EntityImage_TimeStamp GetMethod = "" }; SafeAddField(fields, imageTimestamp); var imageUrl = new MappingField { Attribute = new CrmPropertyAttribute { IsLookup = false, LogicalName = "entityimage_url", IsEntityReferenceHelper = false }, SchemaName = "EntityImage_URL", DisplayName = "EntityImage_URL", HybridName = "EntityImage_URL", TargetTypeForCrmSvcUtil = "string", FieldType = AttributeTypeCode.String, IsValidForUpdate = false, IsValidForCreate = false, Description = " ", // CrmSvcUtil provides an empty description for this EntityImage_URL GetMethod = "" }; SafeAddField(fields, imageUrl); }
private static MappingEntity GetMappingEntity(EntityMetadata entityMetadata, string serverStamp) { var entity = new MappingEntity(); entity.MetadataId = entityMetadata.MetadataId; entity.ServerStamp = serverStamp; entity.Attribute = new CrmEntityAttribute(); entity.TypeCode = entityMetadata.ObjectTypeCode; entity.Attribute.LogicalName = entityMetadata.LogicalName; entity.IsIntersect = entityMetadata.IsIntersect ?? false; entity.Attribute.PrimaryKey = entityMetadata.PrimaryIdAttribute; // entity.DisplayName = Helper.GetProperVariableName(entityMetadata.SchemaName); if (entityMetadata.DisplayName != null) { entity.Label = entityMetadata.DisplayName.UserLocalizedLabel != null ? entityMetadata.DisplayName.UserLocalizedLabel.Label : entityMetadata.SchemaName; } entity.SchemaName = entityMetadata.SchemaName; entity.DisplayName = Naming.GetProperEntityName(entityMetadata.SchemaName); entity.HybridName = Naming.GetProperHybridName(entityMetadata.SchemaName, entityMetadata.LogicalName); entity.StateName = entity.HybridName + "State"; if (entityMetadata.Description != null) { if (entityMetadata.Description.UserLocalizedLabel != null) { entity.Description = entityMetadata.Description.UserLocalizedLabel.Label; } } var fields = entityMetadata.Attributes .Where(a => a.AttributeOf == null) .Select(a => MappingField.GetMappingField(a, entity)).ToList(); fields.ForEach(f => { if (f.DisplayName == entity.DisplayName) { f.DisplayName += "1"; } if (f.HybridName == entity.HybridName) { f.HybridName += "1"; } } ); AddEntityImageCrm2013(fields); AddLookupFields(fields); entity.Fields = fields.ToArray(); entity.States = entityMetadata.Attributes.Where(a => a is StateAttributeMetadata) .Select(a => MappingEnum.GetMappingEnum(a as EnumAttributeMetadata)) .FirstOrDefault(); entity.Enums = entityMetadata.Attributes .Where(a => a is PicklistAttributeMetadata || a is StateAttributeMetadata || a is StatusAttributeMetadata) .Select(a => MappingEnum.GetMappingEnum(a as EnumAttributeMetadata)).ToArray(); entity.PrimaryKey = entity.Fields.First(f => f.Attribute.LogicalName == entity.Attribute.PrimaryKey); entity.PrimaryKeyProperty = entity.PrimaryKey.DisplayName; entity.PrimaryNameAttribute = entityMetadata.PrimaryNameAttribute; entity.RelationshipsOneToMany = entityMetadata.OneToManyRelationships.Select(r => MappingRelationship1N.Parse(r, entity.Fields)).ToArray(); entity.RelationshipsManyToOne = entityMetadata.ManyToOneRelationships.Select(r => MappingRelationshipN1.Parse(r, entity.Fields)).ToArray(); var relationshipsManyToMany = entityMetadata.ManyToManyRelationships.Select(r => MappingRelationshipMN.Parse(r, entity.LogicalName)).ToList(); var selfReferenced = relationshipsManyToMany.Where(r => r.IsSelfReferenced).ToList(); foreach (var referenced in selfReferenced) { var referencing = (MappingRelationshipMN)referenced.Clone(); referencing.DisplayName = "Referencing" + Naming.GetProperVariableName(referenced.SchemaName); referencing.EntityRole = "Microsoft.Xrm.Sdk.EntityRole.Referencing"; relationshipsManyToMany.Add(referencing); } entity.RelationshipsManyToMany = relationshipsManyToMany.OrderBy(r => r.DisplayName).ToArray(); return(entity); }
private static void UpdateMappingEntity(EntityMetadata entityMetadata, MappingEntity entity, string serverStamp) { entity.ServerStamp = serverStamp; entity.TypeCode = entityMetadata.ObjectTypeCode ?? entity.TypeCode; entity.Attribute.LogicalName = entityMetadata.LogicalName ?? entity.Attribute.LogicalName; entity.IsIntersect = (entityMetadata.IsIntersect ?? entity.IsIntersect); entity.Attribute.PrimaryKey = entityMetadata.PrimaryIdAttribute ?? entity.Attribute.PrimaryKey; // entity.DisplayName = Helper.GetProperVariableName(entityMetadata.SchemaName); if (entityMetadata.DisplayName != null) { entity.Label = entityMetadata.DisplayName.UserLocalizedLabel != null ? entityMetadata.DisplayName.UserLocalizedLabel.Label : entityMetadata.SchemaName; } if (entityMetadata.SchemaName != null) { entity.DisplayName = Naming.GetProperEntityName(entityMetadata.SchemaName); entity.SchemaName = entityMetadata.SchemaName; if (entityMetadata.LogicalName != null) { entity.HybridName = Naming.GetProperHybridName(entityMetadata.SchemaName, entityMetadata.LogicalName); } } entity.StateName = entity.HybridName + "State"; if (entityMetadata.Description != null) { if (entityMetadata.Description.UserLocalizedLabel != null) { entity.Description = entityMetadata.Description.UserLocalizedLabel.Label; } } MappingField.UpdateCache(entityMetadata.Attributes.ToList(), entity); var fields = entity.Fields.ToList(); fields.ForEach(f => { if (f.DisplayName == entity.DisplayName) { f.DisplayName += "1"; } if (f.HybridName == entity.HybridName) { f.HybridName += "1"; } }); AddEntityImageCrm2013(fields); AddLookupFields(fields); entity.Fields = fields.ToArray(); var states = entity.Fields.FirstOrDefault(a => a.IsStateCode); entity.States = (states != null) ? states.EnumData : null; entity.Enums = entity.Fields .Where(a => a.EnumData != null) .Select(a => a.EnumData).ToArray(); entity.PrimaryKey = entity.Fields.First(f => f.Attribute.LogicalName == entity.Attribute.PrimaryKey); entity.PrimaryKeyProperty = entity.PrimaryKey.DisplayName; entity.PrimaryNameAttribute = entityMetadata.PrimaryNameAttribute ?? entity.PrimaryNameAttribute; MappingRelationship1N.UpdateCache(entityMetadata.OneToManyRelationships.ToList(), entity, entity.Fields); MappingRelationshipN1.UpdateCache(entityMetadata.ManyToOneRelationships.ToList(), entity, entity.Fields); MappingRelationshipMN.UpdateCache(entityMetadata.ManyToManyRelationships.ToList(), entity, entity.LogicalName); var relationshipsManyToMany = entity.RelationshipsManyToMany.ToList(); var selfReferenced = entity.RelationshipsManyToMany.Where(r => r.IsSelfReferenced).ToList(); foreach (var referenced in selfReferenced) { var referencing = (MappingRelationshipMN)referenced.Clone(); referencing.DisplayName = "Referencing" + Naming.GetProperVariableName(referenced.SchemaName); referencing.EntityRole = "Microsoft.Xrm.Sdk.EntityRole.Referencing"; relationshipsManyToMany.Add(referencing); } entity.RelationshipsManyToMany = relationshipsManyToMany.OrderBy(r => r.DisplayName).ToArray(); }
private static string GetTargetType(MappingField field) { if (field.IsPrimaryKey) { return("System.Nullable<System.Guid>"); } switch (field.FieldType) { case AttributeTypeCode.Picklist: return("Microsoft.Xrm.Sdk.OptionSetValue"); case AttributeTypeCode.BigInt: return("System.Nullable<long>"); case AttributeTypeCode.Integer: return("System.Nullable<int>"); case AttributeTypeCode.Boolean: return("System.Nullable<bool>"); case AttributeTypeCode.DateTime: return("System.Nullable<System.DateTime>"); case AttributeTypeCode.Decimal: return("System.Nullable<decimal>"); case AttributeTypeCode.Money: return("Microsoft.Xrm.Sdk.Money"); case AttributeTypeCode.Double: return("System.Nullable<double>"); case AttributeTypeCode.Uniqueidentifier: return("System.Nullable<System.Guid>"); case AttributeTypeCode.Lookup: case AttributeTypeCode.Owner: case AttributeTypeCode.Customer: return("Microsoft.Xrm.Sdk.EntityReference"); case AttributeTypeCode.State: return("System.Nullable<" + field.Entity.StateName + ">"); case AttributeTypeCode.Status: return("Microsoft.Xrm.Sdk.OptionSetValue"); case AttributeTypeCode.Memo: case AttributeTypeCode.Virtual: case AttributeTypeCode.EntityName: case AttributeTypeCode.String: return("string"); case AttributeTypeCode.PartyList: return("System.Collections.Generic.IEnumerable<ActivityParty>"); case AttributeTypeCode.ManagedProperty: return("Microsoft.Xrm.Sdk.BooleanManagedProperty"); default: return("object"); } }
public static MappingField GetMappingField(AttributeMetadata attribute, MappingEntity entity) { var result = new MappingField(); result.Entity = entity; result.MetadataId = attribute.MetadataId; result.AttributeOf = attribute.AttributeOf; result.IsValidForCreate = attribute.IsValidForCreate ?? false; result.IsValidForRead = attribute.IsValidForRead ?? false; result.IsValidForUpdate = attribute.IsValidForUpdate ?? false; result.IsActivityParty = attribute.AttributeType == AttributeTypeCode.PartyList; result.IsStateCode = attribute.AttributeType == AttributeTypeCode.State; result.DeprecatedVersion = attribute.DeprecatedVersion; result.IsDeprecated = !string.IsNullOrWhiteSpace(attribute.DeprecatedVersion); if (attribute is PicklistAttributeMetadata || attribute is StateAttributeMetadata || attribute is StatusAttributeMetadata) { result.EnumData = MappingEnum.GetMappingEnum(attribute as EnumAttributeMetadata); } if (attribute is LookupAttributeMetadata) { var lookup = attribute as LookupAttributeMetadata; if (lookup.Targets.Count() == 1) { result.LookupSingleType = lookup.Targets[0]; } } ParseMinMaxValues(attribute, result); if (attribute.AttributeType != null) { result.FieldType = attribute.AttributeType.Value; } result.IsPrimaryKey = attribute.IsPrimaryId == true; result.LogicalName = attribute.LogicalName; result.SchemaName = attribute.SchemaName; result.DisplayName = Naming.GetProperVariableName(attribute); result.PrivatePropertyName = Naming.GetEntityPropertyPrivateName(attribute.SchemaName); result.HybridName = Naming.GetProperHybridFieldName(result.DisplayName, result.Attribute); if (attribute.Description != null) { if (attribute.Description.UserLocalizedLabel != null) { result.Description = attribute.Description.UserLocalizedLabel.Label; } } if (attribute.DisplayName != null) { if (attribute.DisplayName.LocalizedLabels != null) { result.LocalizedLabels = attribute.DisplayName .LocalizedLabels.Select(label => new LocalizedLabelSerialisable { LanguageCode = label.LanguageCode, Label = label.Label }).ToArray(); } if (attribute.DisplayName.UserLocalizedLabel != null) { result.Label = attribute.DisplayName.UserLocalizedLabel.Label; } } result.IsRequired = attribute.RequiredLevel != null && attribute.RequiredLevel.Value == AttributeRequiredLevel.ApplicationRequired; result.Attribute = new CrmPropertyAttribute { LogicalName = attribute.LogicalName, IsLookup = attribute.AttributeType == AttributeTypeCode.Lookup || attribute.AttributeType == AttributeTypeCode.Customer }; result.TargetTypeForCrmSvcUtil = GetTargetType(result); result.FieldTypeString = result.TargetTypeForCrmSvcUtil; return(result); }