protected override void VisitCreateTableDefinition(CreateTableDefinition item)
        {
            var entityName = _NamingConvention.GetEntityLogicalName(item.Name);

            EntityBuilder = EntityConstruction.ConstructEntity(entityName);
            EntityBuilder.SchemaName(_NamingConvention.GetEntitySchemaName(entityName))
            .DisplayName(_NamingConvention.GetEntityDisplayName(entityName))
            .DisplayCollectionName(_NamingConvention.GetEntityDisplayCollectionName(entityName));

            if (item.Columns != null && item.Columns.Any())
            {
                foreach (var col in item.Columns)
                {
                    ((IVisitableBuilder)col).Accept(this);
                }
            }

            if (!HasFoundPrimaryKey)
            {
                throw new NotSupportedException("Dynamics CRM requires that you specify a single PRIMARY KEY column. This should be of datatype UNIQUEIDENTIFIER");
            }

            if (!HasFoundNameColumn)
            {
                throw new NotSupportedException("Dynamics CRM requires that you specify the primary name column. This should be of datatype VARCHAR or NVARCHAR.");
            }
        }
        protected virtual void CreateTestEntity()
        {
            using (var orgService = (OrganizationServiceContext)this.GetCrmServiceProvider().GetOrganisationService())
            {
                try
                {
                    _TestEntityMetadata = GetTestEntityMetadata();
                }
                catch (Exception e)
                {
                    if (e.Message.ToLower().StartsWith("could not find"))
                    {
                        _TestEntityMetadata = null;
                    }
                    else
                    {
                        throw;
                    }
                }

                if (_TestEntityMetadata == null)
                {
                    var createRequest = new CreateEntityRequest();
                    var entityBuilder = EntityConstruction.ConstructEntity(TestDynamicsCrmServerSyncProvider.TestEntityName);

                    var attBuilder = entityBuilder
                                     .Description("Sync Plugin Test")
                                     .DisplayCollectionName("Sync Plugin Test Entities")
                                     .DisplayName("Sync Plugin Test")
                                     .WithAttributes()
                                     .NameAttribute(TestDynamicsCrmServerSyncProvider.NameAttributeName, TestDynamicsCrmServerSyncProvider.NameAttributeName, "name", "name attribute", AttributeRequiredLevel.Recommended, 255, StringFormat.Text)
                                     .StringAttribute(SyncColumnInfo.CreatedBySyncClientIdAttributeName, "created by sync client", "The sync client that created this record", AttributeRequiredLevel.Recommended, 255, StringFormat.Text)

                                     .DecimalAttribute(SyncColumnInfo.CreatedRowVersionAttributeName,
                                                       "CrmSync Creation Version",
                                                       "The RowVersion of the record when it was created.",
                                                       AttributeRequiredLevel.None, 0, null, 0)
                                     .DateTimeAttribute(TestDynamicsCrmServerSyncProvider.TestDatetimeColumnName,
                                                        "test date time",
                                                        "The test datetime value.", AttributeRequiredLevel.None, DateTimeFormat.DateAndTime, ImeMode.Auto)
                                     .DateTimeAttribute(TestDynamicsCrmServerSyncProvider.TestDateOnlyColumnName,
                                                        "test date time",
                                                        "The test datetime value.", AttributeRequiredLevel.None, DateTimeFormat.DateOnly, ImeMode.Auto);


                    // Loop through supported decimal precision and create a decimal attribute for each precision.
                    for (int i = DecimalAttributeMetadata.MinSupportedPrecision; i <= DecimalAttributeMetadata.MaxSupportedPrecision; i++)
                    {
                        attBuilder = attBuilder.DecimalAttribute(TestDynamicsCrmServerSyncProvider.DecimalColumnNamePrefix + i.ToString(CultureInfo.InvariantCulture),
                                                                 "test dec " + i.ToString(CultureInfo.InvariantCulture), "test decimal field", AttributeRequiredLevel.Recommended,
                                                                 System.Convert.ToDecimal(DecimalAttributeMetadata.MinSupportedValue), System.Convert.ToDecimal(DecimalAttributeMetadata.MaxSupportedValue), i);
                    }

                    // Loop through supported money precision and create a money attribute for each precision.
                    for (int i = MoneyAttributeMetadata.MinSupportedPrecision; i <= MoneyAttributeMetadata.MaxSupportedPrecision; i++)
                    {
                        attBuilder = attBuilder.MoneyAttribute(TestDynamicsCrmServerSyncProvider.MoneyColumnNamePrefix + i.ToString(CultureInfo.InvariantCulture),
                                                               "test money " + i.ToString(CultureInfo.InvariantCulture), "test money field", AttributeRequiredLevel.Recommended,
                                                               MoneyAttributeMetadata.MinSupportedValue, MoneyAttributeMetadata.MaxSupportedValue, i, 0);
                    }

                    attBuilder = attBuilder.BooleanAttribute(TestDynamicsCrmServerSyncProvider.BoolColumnName, "test bool",
                                                             "test bool field", AttributeRequiredLevel.Recommended, "Yes", 1, "No", 2);

                    //// Add in all possible integer formats.
                    //var enumVals = Enum.GetValues(typeof(IntegerFormat));
                    //foreach (var enumVal in enumVals)
                    //{
                    //    IntegerFormat format = (IntegerFormat)enumVal;
                    //    string formatName = format.ToString();

                    //    attBuilder = attBuilder.IntAttribute(TestDynamicsCrmServerSyncProvider.IntColumnName + formatName, "test int" + formatName,
                    //                        "test int field", AttributeRequiredLevel.Recommended, format, 0, int.MaxValue);

                    //}

                    // TODO experiment with other formats of memo although not sure they really make sense..
                    attBuilder.MemoAttribute(TestDynamicsCrmServerSyncProvider.MemoColumnName, "test memo",
                                             "test memo field", AttributeRequiredLevel.Recommended, 255,
                                             StringFormat.TextArea);


                    // TODO experiment with other formats of memo although not sure they really make sense..
                    var options = new Dictionary <string, int>();
                    for (int i = TestDynamicsCrmServerSyncProvider.PicklistColumnMinValue; i <= TestDynamicsCrmServerSyncProvider.PicklistColumnMaxValue; i++)
                    {
                        string labelText = "testoption" + i;
                        var    optionVal = i;
                        options.Add(labelText, optionVal);
                    }

                    //todo what about global?
                    //todo what about other OptionSetTypes?
                    attBuilder.PicklistAttribute(TestDynamicsCrmServerSyncProvider.PicklistColumnName, "test picklist",
                                                 "test picklist field", AttributeRequiredLevel.Recommended, false, OptionSetType.Picklist, options);


                    var entityMetadata = entityBuilder.Build();
                    createRequest.Entity = entityMetadata;


                    //  createRequest.HasActivities = false;
                    //  createRequest.HasNotes = false;
                    createRequest.PrimaryAttribute = entityBuilder.GetNameAttribute();
                    //  createRequest.SolutionUniqueName =
                    try
                    {
                        var createResponse = (CreateEntityResponse)orgService.Execute(createRequest);
                        foreach (var att in entityBuilder.AttributeBuilder.Attributes.Where(a => a.SchemaName != TestDynamicsCrmServerSyncProvider.NameAttributeName))
                        {
                            try
                            {
                                var createAttributeRequest = new CreateAttributeRequest
                                {
                                    EntityName = entityBuilder.Entity.LogicalName,
                                    Attribute  = att
                                };
                                var createAttResponse = (CreateAttributeResponse)orgService.Execute(createAttributeRequest);
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("Could not create attribute: " + att.LogicalName + ", because " + ex.Message);
                                // throw;
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                        throw;
                    }

                    this._TestEntityMetadata = GetTestEntityMetadata();
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Ensures test entity is created in CRM.
        /// </summary>
        protected void EnsureCrmMetadataProvisioned()
        {
            // Check for entity - if it doesn't exist then create it.
            var request = new RetrieveEntityRequest();

            request.RetrieveAsIfPublished = true;
            var entityName        = EntityName;
            var nameattributename = NameAttributeName;

            request.LogicalName = entityName;
            RetrieveEntityResponse response = null;

            try
            {
                response = (RetrieveEntityResponse)_OrganizationService.Execute(request);
            }
            catch (Exception e)
            {
                if (e.Message.ToLower().StartsWith("could not find"))
                {
                    response = null;
                }
                else
                {
                    throw;
                }
            }

            if (response == null || response.EntityMetadata == null)
            {
                var createRequest = new CreateEntityRequest();

                var entityBuilder = EntityConstruction.ConstructEntity(entityName);
                createRequest.Entity = entityBuilder
                                       .Description("CrmSync Client")
                                       .DisplayCollectionName("CrmSync Clients")
                                       .DisplayName("CrmSync Client")
                                       .WithAttributes()
                                       .StringAttribute(nameattributename, "Client Name", "CrmSync client name", AttributeRequiredLevel.ApplicationRequired, 255, StringFormat.Text)
                                       .StringAttribute(ClientIdentitiferAttributeName, "Client Identifer", "CrmSync client identifier", AttributeRequiredLevel.ApplicationRequired, 60, StringFormat.Text)
                                       .DateTimeAttribute(AnchorRequestedOnAttributeName, "Anchor Requested On", "Anchor Requested On", AttributeRequiredLevel.ApplicationRequired, DateTimeFormat.DateAndTime, ImeMode.Auto)
                                       .MetaDataBuilder.Build();

                createRequest.PrimaryAttribute = (StringAttributeMetadata)entityBuilder.AttributeBuilder.Attributes[0];
                //  createRequest.SolutionUniqueName =
                //try
                //{
                var createResponse = (CreateEntityResponse)_OrganizationService.Execute(createRequest);
                foreach (var att in entityBuilder.AttributeBuilder.Attributes.Where(a => a.SchemaName != nameattributename))
                {
                    var createAttributeRequest = new CreateAttributeRequest
                    {
                        EntityName = entityBuilder.Entity.LogicalName,
                        Attribute  = att
                    };
                    var createAttResponse = (CreateAttributeResponse)_OrganizationService.Execute(createAttributeRequest);
                }
                //}
                //catch (Exception e)
                //{
                //    throw;
                //}
            }
        }