Я пытаюсь скопировать поля поиска из CRM в другую CRM. Но это не удается, потому что обычно я получаю исключение, говорящее, что атрибут с логическим именем поиска не существует.
Хорошо, я знаю это, потому что я пытаюсь создать это. Когда это происходит, ссылочный атрибут отношения является поиском, поэтому поиск должен быть в ссылочном атрибуте.
Но я пытаюсь найти отношения, которые имеют логическое имя поиска в указанном атрибуте, и я не нахожу, я пробовал OneToMany и ManyToOne обеих сущностей. Поэтому мне нужна помощь, чтобы решить эту проблему. У кого-нибудь есть решение?
Я не хочу решать эту проблему с помощью решений, поскольку решения не могут копировать управляемые поля поиска. И у меня есть все атрибуты и сущности, которые нужно создать в другой CRM, мне нужно только создать поиск и ваши отношения.
У меня есть этот базовый код, но для его проверки необходимы 2 CRM.
public void CopyLookup() {
List<EntityMetadata> OriginEntities = new List<EntityMetadata>();
bool sucess = false;
while (!sucess) {
try {
RetrieveAllEntitiesRequest metaDataRequest = new RetrieveAllEntitiesRequest();
metaDataRequest.EntityFilters = EntityFilters.All;
// Execute the request.
RetrieveAllEntitiesResponse metaDataResponse = (RetrieveAllEntitiesResponse)Origin.IOrganizationService.Execute(metaDataRequest);
OriginEntities = new List<EntityMetadata>(metaDataResponse.EntityMetadata);
sucess = true;
return entitiesMetadata;
} catch (ThreadAbortException) {
} catch (Exception _ex) {
Console.WriteLine(String.Format("Fail to find Entities - {0}", _ex.Message));
if (_ex.Message.Contains("There was no endpoint"))
sucess = false;
else
throw new Exception(String.Format("Fail to find Entities - {0}", _ex.Message));
}
}
foreach (EntityMetadata ent in OriginEntities.Where(wh => wh.LogicalName.Contains('_'))) {
foreach (OneToManyRelationshipMetadata relation in ent.OneToManyRelationships) {
LookupAttributeMetadata lookup = (LookupAttributeMetadata)OriginEntities.Where(wh => relation.ReferencingEntity == wh.LogicalName).FirstOrDefault()
.Attributes.Where(wa => wa.AttributeType == AttributeTypeCode.Lookup && wa.LogicalName == relation.ReferencingAttribute).FirstOrDefault();
if (lookup == null)
continue;
CreateOneToManyRequest createOtm = new CreateOneToManyRequest() {
OneToManyRelationship = relation,
Lookup = lookup
};
bool sucess2 = false;
while (!sucess2) {
try {
Migration.IOrganizationService.Execute(createOtm);
} catch (EndpointNotFoundException) {
sucess2 = false;
} catch (TimeoutException) {
sucess2 = false;
} catch (FaultException ex) {
if (ex.Message.Contains("endpoint")) {
sucess2 = false;
} else if (ex.Message.Contains("there is already")) {
sucess2 = true;
} else {
sucess2 = true;
}
} catch (Exception ex) {
if (ex.Message.Contains("This could be due to the service endpoint binding")) {
sucess2 = false;
} else if (ex.Message.Contains("is not unique")) {
sucess2 = true;
} else {
sucess2 = true;
}
}
}
}
}
}