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);
            });
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }