12

Diese Frage zu Microsoft Dynamics CRM 2015 verbunden ist, dass ich durch API nenne.Anmerkung zu einem Kontakt Entität in Microsoft Dynamics CRM von API

I erstellen Kontakt Einheit:

POST [organization URI]/api/data/contacts 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
{ 
    "emailaddress1": "[email protected]", 
} 

Es funktioniert, sehe ich neuen Rekord, nachdem ich in das Panel einloggen. Und ich kann es durch die API-Aufruf:

[organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00) 
{ 
    "@odata.context":"[organization URI]/api/data/$metadata#contacts/$entity", 
    "@odata.etag":"W/\"460199\"", 
    ... 
    "contactid":"f76e4e7c-ea61-e511-80fd-3863bb342b00", 
    "emailaddress1":"[email protected]", 
    .... 
} 

Das nächste, was ich tun möchte, ist Anmerkung Datensatz mit diesem Kontakt zugeordnet hinzuzufügen. Im Anschluss an die guide Ich nenne:

POST [organization URI]/api/data/annotations 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
{ 
    "notetext": "TEST", 
    '[email protected]': 'contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)' 
} 

Aber es gibt 400 Fehler:

An undeclared property 'contact' which only has property annotations in the payload but no property value was found in the payload. In OData, only declared navigation properties and declared named streams can be represented as properties without values.

Als ich nennen:

POST [organization URI]/api/data/annotations 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
{ 
    "notetext": "TEST", 
} 

neue Einheit geschaffen wird, aber ohne Beziehung zu kontaktieren.

Wie wird diese POST-Anfrage richtig erstellt? Was fehlt mir hier? Ich vermute, dass [email protected] irgendwie anders dargestellt werden sollte, habe ich versucht [email protected], [email protected], [email protected] - aber keine Auswirkungen.

Irgendwelche Ideen?

+0

, warum Sie die Web-API-Vorschau und nicht die REST-Endpunkt verwenden? –

+0

der Code sollte '" [email protected] ":"/contacts (f76e4e7c-ea61-e511-80fd-3863bb342b00) "' notieren Sie die '/' vor Kontakte und die Anführungszeichen (nur für den Fall) –

+0

@GuidoPreite I habe es versucht und die Fehlermeldung lautet: 'Eine Eigenschaft 'objectid', die nur Eigenschaften-Annotationen in der Payload hat, aber kein Eigenschaftswert wird vom Typ 'Edm.Guid' deklariert. In OData können nur Navigationseigenschaften und benannte Datenströme als Eigenschaften ohne Werte dargestellt werden. – maicher

Antwort

5

Ich habe diese Arbeit gefunden, aber in zwei Anfragen:

POST [organization URI]/api/data/annotations 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
{ 
    "notetext": "TEST" 
} 

POST [organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)/Contact_Annotation/$ref 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
{ 
    "@odata.id": "[organization URI]/annotations(annotation_id_from_first_request)" 
} 

Edit:

annotation_id_from_first_request Wert genommen wird, erste Anforderung Antwortformular aus.

+1

Wie kennen Sie die Annotation_id_from_first_request ???? –

+0

Von der Antwort der ersten Anfrage. – maicher

11

Anstatt [email protected] zu verwenden, müssen Sie [email protected] verwenden. Diese Ergebnisse sind in:

"[email protected]": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)" 

die Liste der Eigenschaften zu erhalten, suchen Sie unter den einzelnen Wert Navigationseigenschaften im documentation.

+1

Dies ist besser als die angenommene Antwort, da nur 1 Anruf verwendet wird. Ich vermute, das Hinzufügen von "_contact" (oder etwas Ähnliches) hängt davon ab, ob der aktuelle Datensatz ein Elternteil oder ein Kind ist. – zabby

+1

Ich glaube, dass dies daran liegt, dass dies spezifisch für das betreffende Feld bei Noten ist, die verschiedene Entitäten nachschlagen können. Daher hängt der _contact davon ab, für welches Objekt Sie ihn festlegen möchten (immer objectivid_entityname für Anmerkungen zum Feld). – Justin

4

Ich verwende diesen C# -Code für die Erstellung und Verknüpfung (das Task.Await Zeug ist nicht sehr klug, so ... vorsichtig sein):

 dynamic testAno = new ExpandoObject(); 
     testAno.NoteText = "Hello World!"; 
     testAno.Subject = "Note Subject"; 

     dynamic refAccount = new ExpandoObject(); 
     refAccount.LogicalName = "account"; 
     refAccount.Id = "003CCFC2-4012-DE11-9654-001F2964595C"; 

     testAno.ObjectId = refAccount; 
     testAno.ObjectTypeCode = refAccount.LogicalName; 

     var demo = JsonConvert.SerializeObject(testAno); 

     HttpContent content = new StringContent(demo, Encoding.UTF8, "application/json"); 

     var handler = new HttpClientHandler { UseDefaultCredentials = true }; 

     HttpClient client = new HttpClient(handler); 
     var test = client.PostAsync(new Uri("http://crm/.../XRMServices/2011/OrganizationData.svc/AnnotationSet"), content).Result; 

Die JSON wird wie folgt aussehen:

{"NoteText":"Hello World!", 
"Subject":"Note Subject", 
"ObjectId": {"LogicalName":"account", 
       "Id":"003CCFC2-4012-DE11-9654-001F2964595C"} 
,"ObjectTypeCode":"account"} 
4

Diese Antwort gilt für Web-api Nutzung:

Wenn die Referenzen Eigenschaft definiert wurde Großbuchstaben verwenden, müssen Sie Großbuchstaben in der Eigenschaft auf Aktualisierung und einfügen verwenden. Sehen Sie sich den Namen des Schemas in der Eigenschaftsliste der primären Entität an.

"[email protected]":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)" 

Der Groß:

Können sagen, Sie eine Entität haben myprefix_entity mit einem Verweis auf das Konto Entität genannt, und Sie nannten es Account, und der Schemaname wurde myprefix_AccountId, würden Sie es als verweisen müssen A und der Großbuchstabe I in myprefix_AccountId zählt, wenn so der Schemaname definiert wurde.

4

Teil 1:
MSDN Referenz: Deep Insert

You can create entities related to each other by defining them as navigation properties values. This is known as deep insert. As with a basic create, the response OData-EntityId header contains the Uri of the created entity. The URIs for the related entities created aren’t returned.

Below-Code ist Konto (1) zu erstellen, erstellen + Associate Primärkontakt (2), erstellen Sie & assoziierte Chance (3) und erstellen + assoziiertes Aufgabe (4)

POST [Organization URI]/api/data/v8.2/accounts HTTP/1.1 
Content-Type: application/json; charset=utf-8 
OData-MaxVersion: 4.0 
OData-Version: 4.0 
Accept: application/json 

{ 
"name": "Sample Account", 
"primarycontactid": 
{ 
    "firstname": "John", 
    "lastname": "Smith" 
}, 
"opportunity_customer_accounts": 
[ 
    { 
     "name": "Opportunity associated to Sample Account", 
     "Opportunity_Tasks": 
     [ 
     { "subject": "Task associated to opportunity" } 
     ] 
    } 
] 
} 

Teil 2:
Verknüpfen von Annotationen mit Kontakten verwendet die folgende Syntax.

note["[email protected]"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)"; 

Siehe SO link & blog

Teil 3:
Antwort auf deinen Kommentar zu einer anderen Antwort über annotation_id_from_first_request:

Um die erstellte Datensatz-ID als Antwort von den letzten Anfrage zu erhalten, können Sie parsen wie folgt:

   //get Response from Created Record 
       entityIdWithLink = XMLHttpRequest.getResponseHeader("OData-EntityId"); 

       //get EntityId from ResponseHeader of Created Record 
       getEntityId = entityIdWithLink.split(/[()]/); 
       getEntityId = getEntityId[1]; 

Sie können read more

You can compose your POST request so that data from the created record will be returned with a status of 201 (Created).
To get this result, you must use the return=representation preference in the request headers. To control which properties are returned, append the $select query option to the URL to the entity set.
The $expand query option will be ignored if used. When an entity is created in this way the OData-EntityId header containing the URI to the created record is not returned

Note: This capability was added with December 2016 update for Dynamics 365

MSDN Referenz: Create with data returned