Вы можете сделать отношения N: N через пользовательский интерфейс, перейдя к сущностям отношения N: N. Преимущество использования отношений 2: 1 с промежуточной сущностью перед выполнением одного N: N, например, вы можете хранить атрибуты отношений (роль для отношений), а также вы можете связывать рабочие процессы через двойные отношения N: 1.
EDIT:
Чтобы создать отношения N: N с помощью кода, вы можете обратиться к справочной странице CRM 2011 SDK «Создание и получение связей сущностей», приведенной ниже. Вы сможете сделать что-то похожее через сервис метаданных в 4.0 -
Создание отношения сущностей N: N
В следующем примере используется метод ElptableCreateManyToManyRelationship, чтобы убедиться, что сущности Account и Campaign могут участвовать в отношениях сущностей N: N, а затем создать связь сущностей с помощью CreateManyToManyRequest.
bool accountEligibleParticipate =
EligibleCreateManyToManyRelationship("account");
bool campaignEligibleParticipate =
EligibleCreateManyToManyRelationship("campaign");
if (accountEligibleParticipate && campaignEligibleParticipate)
{
CreateManyToManyRequest createManyToManyRelationshipRequest =
new CreateManyToManyRequest
{
IntersectEntitySchemaName = "new_accounts_campaigns",
ManyToManyRelationship = new ManyToManyRelationshipMetadata
{
SchemaName = "new_accounts_campaigns",
Entity1LogicalName = "account",
Entity1AssociatedMenuConfiguration =
new AssociatedMenuConfiguration
{
Behavior = AssociatedMenuBehavior.UseLabel,
Group = AssociatedMenuGroup.Details,
Label = new Label("Account", 1033),
Order = 10000
},
Entity2LogicalName = "campaign",
Entity2AssociatedMenuConfiguration =
new AssociatedMenuConfiguration
{
Behavior = AssociatedMenuBehavior.UseLabel,
Group = AssociatedMenuGroup.Details,
Label = new Label("Campaign", 1033),
Order = 10000
}
}
};
CreateManyToManyResponse createManytoManyRelationshipResponse =
(CreateManyToManyResponse)_serviceProxy.Execute(
createManyToManyRelationshipRequest);
_manyToManyRelationshipId =
createManytoManyRelationshipResponse.ManyToManyRelationshipId;
_manyToManyRelationshipName =
createManyToManyRelationshipRequest.ManyToManyRelationship.SchemaName;
Console.WriteLine(
"The many-to-many relationship has been created between {0} and {1}.",
"account", "campaign");
}
EligibleCreateManyToManyRelationship
В следующем примере создается метод ElptableCreateManyToManyRelationship, который использует CanManyToManyRequest для проверки того, может ли объект участвовать в отношении сущностей N: N.
/// <summary>
/// Determines whether the entity can participate in a many-to-many relationship.
/// </summary>
/// <param name="entity">Entity</param>
/// <returns></returns>
public bool EligibleCreateManyToManyRelationship(string entity)
{
CanManyToManyRequest canManyToManyRequest = new CanManyToManyRequest
{
EntityName = entity
};
CanManyToManyResponse canManyToManyResponse =
(CanManyToManyResponse)_serviceProxy.Execute(canManyToManyRequest);
if (!canManyToManyResponse.CanManyToMany)
{
Console.WriteLine(
"Entity {0} can't participate in a many-to-many relationship.",
entity);
}
return canManyToManyResponse.CanManyToMany;
}