示例#1
0
        private void UpdateEntity(IOrganizationService service, Entity entity, string entityKey, int recordNumber, EntityReference ownerid, OptionSetValue statecode, OptionSetValue statuscode, Dictionary <string, ResolvedEntity[]> resolvedEntities)
        {
            if (!Constants.UpdateModes.Contains(Configuration.ImportMode))
            {
                return;
            }

            bool validForUpdate = resolvedEntities[entityKey].Length == 1 || (resolvedEntities[entityKey].Length > 1 && Configuration.MultipleFoundMode == MultipleFoundMode.All);

            if (!validForUpdate)
            {
                return;
            }

            for (int i = 0; i < resolvedEntities[entityKey].Length; i++)
            {
                var resolvedEntity = resolvedEntities[entityKey][i].Value;
                entityUpdateHandler.BuildEntityForUpdate(entity, resolvedEntity, Configuration.ImportMode);

                try
                {
                    if (entity.Attributes.Count > 0)
                    {
                        service.Update(entity);
                        foreach (var attribute in entity.Attributes)
                        {
                            resolvedEntity.Attributes.Add(attribute.Key, attribute.Value);
                        }
                    }
                    else
                    {
                        // Can optionally implement - log that an empty was not updated because it was equal
                    }
                }
                catch (FaultException <OrganizationServiceFault> ex)
                {
                    logger.SetWriteFault(recordNumber, ex.Detail.Message);
                }

                var  resolvedEntityOwnerId = resolvedEntity.Contains("ownerid") ? (EntityReference)resolvedEntity["ownerid"] : null;
                bool ownerMustBeSet        = EntityUpdateHandler.OwnerMustBeSet(ownerid, resolvedEntityOwnerId, Configuration.SetOwnerMode);
                if (ownerMustBeSet)
                {
                    service.SetOwnerOfEntity(entity.LogicalName, entity.Id, ownerid.LogicalName, ownerid.Id);
                    resolvedEntity.Attributes.Add("ownerid", ownerid);
                }

                var  resolvedEntityStatuscode = resolvedEntity.Contains("statuscode") ? (OptionSetValue)resolvedEntity["statuscode"] : null;
                bool statusMustBeSet          = EntityUpdateHandler.StatusMustBeSet(statuscode, resolvedEntityStatuscode, Configuration.SetStateMode);
                if (statusMustBeSet)
                {
                    service.SetStateOfEntity(entity.LogicalName, entity.Id, statecode, statuscode);
                    resolvedEntity.Attributes.Add("statecode", statecode);
                    resolvedEntity.Attributes.Add("statuscode", statuscode);
                }
            }
        }
示例#2
0
        public void WriteData(IConnection connection, IDatabaseInterface databaseInterface, IDatastore dataObject, ReportProgressMethod reportProgress)
        {
            reportProgress(new SimpleProgressReport("Building logging database"));
            this.logger = new Logger(databaseInterface);
            this.logger.InitializeDatabase();

            reportProgress(new SimpleProgressReport("Connection to crm"));
            this.service = connection.GetConnection() as IOrganizationService;

            reportProgress(new SimpleProgressReport("Loading Entitymetadata"));
            var entityMetaData = Crm2013Wrapper.Crm2013Wrapper.GetEntityMetadata(service, this.Configuration.EntityName);
            var primaryKeyAttributeMetadataDictionary = new Dictionary <string, AttributeMetadata>();

            foreach (string primaryKey in this.Configuration.PrimaryKeyAttributes)
            {
                AttributeMetadata attributeMetadata = entityMetaData.Attributes.Where(t => t.LogicalName == primaryKey).FirstOrDefault();
                primaryKeyAttributeMetadataDictionary.Add(primaryKey, attributeMetadata);
            }

            attributeMetadataDictionary = entityMetaData.GetAttributeMetadata();

            reportProgress(new SimpleProgressReport("Initialize service-objects"));
            var entityMapper            = new EntityMapper(attributeMetadataDictionary, dataObject.Metadata, Configuration.Mapping, Configuration.PicklistMapping);
            var entityAttributeComparer = new EntityAttributeComparer(attributeMetadataDictionary);

            entityUpdateHandler = new EntityUpdateHandler(entityAttributeComparer);

            reportProgress(new SimpleProgressReport("Mapping attributes of records"));
            Entity[] entities = new Entity[dataObject.Count];
            for (int i = 0; i < dataObject.Count; i++)
            {
                object[] data = dataObject[i];

                Entity entity = new Entity(this.Configuration.EntityName);
                entityMapper.MapAttributes(entity, data);

                entities[i] = entity;
                logger.AddRecord(i);

                if (StatusHelper.MustShowProgress(i, dataObject.Count) == true)
                {
                    reportProgress(new SimpleProgressReport("Mapped " + (i + 1) + " of " + dataObject.Count + " records"));
                }
            }

            reportProgress(new SimpleProgressReport("Resolving relationship entities"));

            foreach (var relationMapping in Configuration.RelationMapping)
            {
                reportProgress(new SimpleProgressReport("Resolving relationship - load metadata for entity " + relationMapping.EntityName));
                EntityMetadata relationEntityMetadata = Crm2013Wrapper.Crm2013Wrapper.GetEntityMetadata(service, relationMapping.EntityName);

                reportProgress(new SimpleProgressReport("Resolving relationship - load related records"));
                JoinResolver relationResolver = new JoinResolver(service, relationEntityMetadata, relationMapping.Mapping);
                Dictionary <string, Guid[]> relatedEntities = relationResolver.BuildMassResolverIndex();

                reportProgress(new SimpleProgressReport("Resolving relationship - set relations"));

                RelationSetter relationSetter = new RelationSetter(relationEntityMetadata, relationMapping.Mapping);
                relationSetter.SetRelation(relationMapping.LogicalName, entities, dataObject, relatedEntities);
            }

            reportProgress(new SimpleProgressReport("Resolving primarykeys of records"));
            var primaryKeyResolver = new PrimaryKeyResolver(service, entityMetaData, primaryKeyAttributeMetadataDictionary);
            var resolvedEntities   = primaryKeyResolver.BatchResolver(entities, Configuration.GetAllMappedAttributes(), Configuration.BatchSizeResolving);

            reportProgress(new SimpleProgressReport("Writing records to crm"));
            WriteEntity(entities, resolvedEntities, primaryKeyAttributeMetadataDictionary, reportProgress);
        }
示例#3
0
        public void Test_EntityUpdateHandler_SetStateMode()
        {
            var value3 = new OptionSetValue(3);
            var value4 = new OptionSetValue(4);

            bool test1 = EntityUpdateHandler.StatusMustBeSet(null, value3, ImportMode.All);

            Assert.IsFalse(test1);

            bool test2 = EntityUpdateHandler.StatusMustBeSet(value3, value3, ImportMode.Create);

            Assert.IsFalse(test2);

            bool test3 = EntityUpdateHandler.StatusMustBeSet(value3, value3, ImportMode.UpdateChangedValuesOnly);

            Assert.IsFalse(test3);

            bool test4 = EntityUpdateHandler.StatusMustBeSet(value3, value3, ImportMode.AllChangedValuesOnly);

            Assert.IsFalse(test4);

            bool test5 = EntityUpdateHandler.StatusMustBeSet(value4, value3, ImportMode.UpdateChangedValuesOnly);

            Assert.IsTrue(test5);

            bool test6 = EntityUpdateHandler.StatusMustBeSet(value4, value3, ImportMode.AllChangedValuesOnly);

            Assert.IsTrue(test6);

            bool test7 = EntityUpdateHandler.StatusMustBeSet(value3, value3, ImportMode.Update);

            Assert.IsTrue(test7);

            bool test8 = EntityUpdateHandler.StatusMustBeSet(value3, value3, ImportMode.All);

            Assert.IsTrue(test8);

            bool test9 = EntityUpdateHandler.StatusMustBeSet(value4, value3, ImportMode.Update);

            Assert.IsTrue(test9);

            bool test10 = EntityUpdateHandler.StatusMustBeSet(value4, value3, ImportMode.All);

            Assert.IsTrue(test10);

            bool test11 = EntityUpdateHandler.StatusMustBeSet(value4, null, ImportMode.UpdateChangedValuesOnly);

            Assert.IsTrue(test11);

            bool test12 = EntityUpdateHandler.StatusMustBeSet(value4, null, ImportMode.AllChangedValuesOnly);

            Assert.IsTrue(test12);

            bool test13 = EntityUpdateHandler.StatusMustBeSet(value4, null, ImportMode.Update);

            Assert.IsTrue(test13);

            bool test14 = EntityUpdateHandler.StatusMustBeSet(value4, null, ImportMode.All);

            Assert.IsTrue(test14);
        }
示例#4
0
        public void Test_EntityUpdateHandler_SetOwnerMode()
        {
            Guid testGuid = Guid.NewGuid();
            var  ownerInSourceWithTestGuid   = new EntityReference("systemuser", testGuid);
            var  ownerInCrmWithTestGuid      = new EntityReference("systemuser", testGuid);
            var  ownerInSourceWithRandomGuid = new EntityReference("systemuser", Guid.NewGuid());
            var  ownerInCrmWithRandomGuid    = new EntityReference("systemuser", Guid.NewGuid());

            bool test1 = EntityUpdateHandler.OwnerMustBeSet(null, ownerInCrmWithRandomGuid, ImportMode.AllChangedValuesOnly);

            Assert.IsFalse(test1);

            bool test2 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithTestGuid, ownerInCrmWithTestGuid, ImportMode.Create);

            Assert.IsFalse(test2);

            bool test3 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithTestGuid, ownerInCrmWithTestGuid, ImportMode.UpdateChangedValuesOnly);

            Assert.IsFalse(test3);

            bool test4 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithTestGuid, ownerInCrmWithTestGuid, ImportMode.AllChangedValuesOnly);

            Assert.IsFalse(test4);

            bool test5 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, ownerInCrmWithTestGuid, ImportMode.UpdateChangedValuesOnly);

            Assert.IsTrue(test5);

            bool test6 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, ownerInCrmWithTestGuid, ImportMode.AllChangedValuesOnly);

            Assert.IsTrue(test6);

            bool test7 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithTestGuid, ownerInCrmWithTestGuid, ImportMode.Update);

            Assert.IsTrue(test7);

            bool test8 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithTestGuid, ownerInCrmWithTestGuid, ImportMode.All);

            Assert.IsTrue(test8);

            bool test9 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, ownerInCrmWithTestGuid, ImportMode.Update);

            Assert.IsTrue(test9);

            bool test10 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, ownerInCrmWithTestGuid, ImportMode.All);

            Assert.IsTrue(test10);

            bool test11 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, null, ImportMode.UpdateChangedValuesOnly);

            Assert.IsTrue(test11);

            bool test12 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, null, ImportMode.AllChangedValuesOnly);

            Assert.IsTrue(test12);

            bool test13 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, null, ImportMode.Update);

            Assert.IsTrue(test13);

            bool test14 = EntityUpdateHandler.OwnerMustBeSet(ownerInSourceWithRandomGuid, null, ImportMode.All);

            Assert.IsTrue(test14);
        }