1
votes

I am using the MetadataService to create 4 entities and create relationships between them.

The entities are: TrexCalendar, TrexFrom, TrexTo, TrexAddress

The relationships (all 1:Many) are:TrexFrom - TrexAddress, TrexCalendar - TrexFrom, TrexTo - TrexAddress, TrexCalendar - TrexTo

When I run my code the entities are all created successfully and the first, second and fourth relationships are created successfully.

Creating the third relationship fails with the following details:

0x80047007 Entity: new_trexaddress is parented to Entity with id: 7a6af338-bc23-e011-ad8c-9f5d300a22fe. Cannot create another parental relation with Entity: new_trexto Platform

7a6af338-bc23-e011-ad8c-9f5d300a22fe is the id for the TrexFrom entity.

So it looks like the SDK won't allow me to create a 1:N relationship between TrexTo and TrexAddress because a 1:N relationship exists between TrexFrom and TrexAddress.

What's weird is that I am able to create this relationship manually using the Dynamics web interface.

Any ideas what might be going on? How can I create both relationships programmatically?

I'm using the following code to create the relationships:

OneToManyMetadata relationship = new OneToManyMetadata
{
    ReferencedEntity = "new_trexto",
    ReferencingEntity = "new_trexaddress"
    SchemaName = "new_trexto_trexaddress",
    AssociatedMenuBehavior = new CrmAssociatedMenuBehavior { Value = AssociatedMenuBehavior.UseCollectionName },
    CascadeAssign = new CrmCascadeType { Value = CascadeType.NoCascade },
    CascadeDelete = new CrmCascadeType { Value = CascadeType.RemoveLink },
    CascadeMerge = new CrmCascadeType { Value = CascadeType.NoCascade },
    CascadeReparent = new CrmCascadeType { Value = CascadeType.NoCascade },
    CascadeShare = new CrmCascadeType { Value = CascadeType.UserOwned },
    CascadeUnshare = new CrmCascadeType { Value = CascadeType.NoCascade }
};

LookupAttributeMetadata lookup = new LookupAttributeMetadata
{
    SchemaName = lookupName,
    RequiredLevel = new CrmAttributeRequiredLevel(AttributeRequiredLevel.Recommended),
    DisplayName = CrmServiceUtility.CreateSingleLabel("TrexTo - TrexAddress", 1033)
};

CreateOneToManyRequest request = new CreateOneToManyRequest
{
    OneToManyRelationship = relationship,
    Lookup = lookup
};

try
{
    metadataService.Execute(request);
    Debug.Print("Relationship created successfully");
}
catch (System.Web.Services.Protocols.SoapException ex)
{
    Debug.Print(ex.Detail.InnerText);
}
1
I was able to get this to work by omitting the line of code that set any of the Cascade values.dlarkin77

1 Answers

4
votes

If both relationships are set as "Parental", you'll probably need to set one of them as "Referential"