/// <summary>
        /// Exports the specified profile.
        /// </summary>
        /// <param name="profile">The profile.</param>
        /// <param name="transportReportFileName">Name of the transport report file.</param>
        private void Export(NtoNAssociationsTransportProfile profile, string transportReportFileName)
        {
            NtoNTransportReport report = null;
            try
            {
                report = new NtoNTransportReport(transportReportFileName);
                //Get Transport Report
                if (File.Exists(transportReportFileName))
                {
                    report = ReadTransportReport(transportReportFileName);
                }

                //Clean Data folder
                string dataExportFolder = Folder + "\\" + profile.ProfileName + "\\Data";
                if (Directory.Exists(dataExportFolder))
                {
                    Directory.Delete(dataExportFolder, true);
                }
                Directory.CreateDirectory(dataExportFolder);

                MSCRMConnection connection = profile.getSourceConneciton();
                NtoNRelationshipsStructure es = ReadEnvStructure(profile.SourceConnectionName);
                _serviceProxy = cm.connect(connection);
                IOrganizationService service = (IOrganizationService)_serviceProxy;
                List<NtoNTransportReportLine> TransportReport = new List<NtoNTransportReportLine>();
                profile.TotalExportedRecords = 0;
                //Mesure export time
                DateTime exportStartDT = DateTime.Now;

                LogManager.WriteLog("Start exporting data from " + connection.ConnectionName);

                int recordCount = 0;
                if (es != null)
                {
                    foreach (SelectedNtoNRelationship ee in profile.SelectedNtoNRelationships)
                    {
                        LogManager.WriteLog("Exporting data for relationship " + ee.RelationshipSchemaName);
                        DateTime entityExportStartDT = DateTime.Now;
                        string fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
                        fetchXml += "<entity name='" + ee.IntersectEntityName + "'>";
                        //Get Entity structure
                        NtoNRelationship strE = new NtoNRelationship();
                        foreach (NtoNRelationship envE in es.NtoNRelationships)
                        {
                            if (envE.IntersectEntityName == ee.IntersectEntityName)
                            {
                                strE = envE;
                                fetchXml += "<attribute name='" + strE.Entity1IntersectAttribute + "' />";
                                fetchXml += "<attribute name='" + strE.Entity2IntersectAttribute + "' />";
                                if (ee.IntersectEntityName == "listmember" || ee.IntersectEntityName == "campaignitem")
                                    fetchXml += "<attribute name='entitytype' />";
                                else if (ee.IntersectEntityName == "campaignactivityitem")
                                    fetchXml += "<attribute name='itemobjecttypecode' />";

                                break;
                            }
                        }

                        //Add Query filter
                        int objectTypeCode = 0;
                        if (ee.Entity2LogicalName == "account") objectTypeCode = 1;
                        else if (ee.Entity2LogicalName == "campaign") objectTypeCode = 4400;
                        else if (ee.Entity2LogicalName == "contact") objectTypeCode = 2;
                        else if (ee.Entity2LogicalName == "lead") objectTypeCode = 4;
                        else if (ee.Entity2LogicalName == "list") objectTypeCode = 4300;
                        else if (ee.Entity2LogicalName == "product") objectTypeCode = 1024;
                        else if (ee.Entity2LogicalName == "salesliterature") objectTypeCode = 1038;

                        if (ee.IntersectEntityName == "campaignitem")
                            fetchXml += "<filter type='and'><condition attribute='entitytype' operator='eq' value='" + objectTypeCode + "' /></filter>";
                        else if (ee.IntersectEntityName == "campaignactivityitem")
                            fetchXml += "<filter type='and'><condition attribute='itemobjecttypecode' operator='eq' value='" + objectTypeCode + "' /></filter>";

                        fetchXml += "</entity></fetch>";
                        int recordCountPerEntity = ExportEntity(profile, fetchXml, ee.RelationshipSchemaName);
                        recordCount += recordCountPerEntity;
                        DateTime entityExportEndDT = DateTime.Now;
                        TimeSpan ts = entityExportEndDT - entityExportStartDT;
                        NtoNTransportReportLine transportReportLine = new NtoNTransportReportLine();
                        transportReportLine.RelationshipSchemaName = ee.RelationshipSchemaName;
                        transportReportLine.ExportedRecords = recordCountPerEntity;
                        report.TotalExportedRecords += recordCountPerEntity;
                        transportReportLine.ExportedIn = ts.ToString().Substring(0, 10);
                        transportReportLine.ExportStartedAt = entityExportStartDT.ToString();
                        transportReportLine.ExportFinishedAt = entityExportEndDT.ToString();
                        report.ReportLines.Add(transportReportLine);
                        WriteTransportReport(report, transportReportFileName);
                    }
                }

                TimeSpan exportTimeSpan = DateTime.Now - exportStartDT;
                LogManager.WriteLog("Export finished for " + profile.SourceConnectionName + ". Exported " + recordCount + " records in " + exportTimeSpan.ToString().Substring(0, 10));
            }
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
            {
                LogManager.WriteLog("Error:" + ex.Detail.Message + "\n" + ex.Detail.TraceText);
            }
            catch (Exception ex)
            {
                if (ex.InnerException != null)
                {
                    LogManager.WriteLog("Error:" + ex.Message + "\n" + ex.InnerException.Message);
                }
                else
                {
                    LogManager.WriteLog("Error:" + ex.Message);
                }
            }
        }
        /// <summary>
        /// Downloads the env structure.
        /// </summary>
        /// <param name="connectionName">Name of the connection.</param>
        /// <returns>The N to N Relationships Structure</returns>
        public NtoNRelationshipsStructure downloadEnvStructure(string connectionName)
        {
            try
            {
                MSCRMConnection connection = cm.getConnection(connectionName);
                _serviceProxy = cm.connect(connection);
                IOrganizationService service = (IOrganizationService)_serviceProxy;
                NtoNRelationshipsStructure es = new NtoNRelationshipsStructure();
                es.NtoNRelationships = new List<NtoNRelationship>();

                RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest()
                {
                    EntityFilters = EntityFilters.Relationships,
                    RetrieveAsIfPublished = true
                };

                // Retrieve the MetaData.
                RetrieveAllEntitiesResponse AllEntitiesResponse = (RetrieveAllEntitiesResponse)_serviceProxy.Execute(request);
                List<string> TreatedRelationships = new List<string>();

                foreach (EntityMetadata currentEntity in AllEntitiesResponse.EntityMetadata)
                {
                    List<ManyToManyRelationshipMetadata> ManyToManyRelationships = currentEntity.ManyToManyRelationships.ToList();
                    foreach (ManyToManyRelationshipMetadata relationship in ManyToManyRelationships)
                    {
                        if (!relationship.IsValidForAdvancedFind.Value)
                            continue;

                        if (relationship.IntersectEntityName == "subscriptionmanuallytrackedobject")
                            continue;

                        if (TreatedRelationships.Find(r => r == relationship.SchemaName) != null)
                            continue;

                        NtoNRelationship ee = new NtoNRelationship();
                        // Start Entity Node
                        ee.RelationshipSchemaName = relationship.SchemaName;
                        ee.IntersectEntityName = relationship.IntersectEntityName;
                        ee.Entity1LogicalName = relationship.Entity1LogicalName;
                        ee.Entity1IntersectAttribute = relationship.Entity1IntersectAttribute;
                        ee.Entity2LogicalName = relationship.Entity2LogicalName;
                        ee.Entity2IntersectAttribute = relationship.Entity2IntersectAttribute;

                        // End Entity Node
                        TreatedRelationships.Add(relationship.SchemaName);
                        es.NtoNRelationships.Add(ee);
                    }
                }

                //Order by SchemaName
                IOrderedEnumerable<NtoNRelationship> orderedNtoNRelationships = es.NtoNRelationships.OrderBy(se => se.RelationshipSchemaName);
                es.NtoNRelationships = orderedNtoNRelationships.ToList<NtoNRelationship>();

                es.connectionName = connectionName;
                WriteEnvStructure(es);

                return es;
            }
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
        }