Ich habe eine übergeordnete (Bestellung) und untergeordnete (OrderDetail), wobei Bestellung bereits in der Datenbank vorhanden ist und OrderDetail auch in der Datenbank vorhanden ist.
Alles, was ich wirklich tun möchte, ist das Hinzufügen eines anderen OrderDetail-Datensatzes, der an den Auftrag gebunden ist.OData V4-Client, der untergeordnete Entität hinzufügt
Ich habe mehrere Pfade hinunter und ich bin nicht einmal sicher, was der richtige Pfad ist.
Lassen Sie uns einige Annahmen machen, dass die Navigation zwischen diesen bereits funktioniert.
Ich kann $ expand = OrderDetails in Ordnung und ich kann auch Orders (1)/OrderDetails gut machen und das Gegenteil von OrderDetails tun.
Basierend auf dieser Updating the Data Service, alles, was ich tun muss, ist AddRelatedObject aufrufen und dann das Objekt der OrderDetails-Auflistung hinzufügen.
// Add the new item with a link to the related Order
context.AddRelatedObject(order, "OrderDetails", newOrderDetail);
// Add the new order detail to the collection
order.Order_Details.Add(newOrderDetail);
newOrderDetail.Order = order;
Scheint einfach genug.
Wenn ich jedoch context.SaveChanges (SaveChangesOptions.ReplaceOnUpdate) ausführen, wird ein Fehler ausgelöst.
{ "Fehler": { "Code": "", "message": "Nein HTTP-Ressource wurde gefunden, dass der Anforderungs-URI übereinstimmt 'http://localhost/Test/odata/Orders(1)/OrderDetails'", "innererror.": { "Message":“ . ":"“, "Stack Trace": keine Routing-Konvention wurde eine Aktion auszuwählen, die für den OData Pfad mit Vorlage '~/EntitySet/key/Navigation' "" type gefunden ""}}}
Aber Wenn ich zur angegebenen URL navigiere, werden Daten angezeigt.
Zeit für Fiddler.
In Fiddler kann ich sehen, das ist ein POST an die URL und kein GET.
Welche es sollte ein POST sein, aber nicht auf die URL aufgeführt.
Die POST/OData/Orderdetails
Runde 2
// Add the new item with a link to the related Order
context.AttachTo("OrderDetails", newOrderDetail);
// Add a link between Order and the new OrderDetail
context.AddLink(order, "OrderDetails", newOrderDetail);
// Add the new order detail to the collection
order.Order_Details.Add(newOrderDetail);
newOrderDetail.Order = order;
Noch ein POST mit einem Fehler, aber die URL ist etwas anders und die entsandte json hat nur „/ OData/Orderdetail (0) "Es hat jetzt auch" $ ref ".
{ "Fehler": { "Code": "", "message": "Keine HTTP-Ressource wurde gefunden, dass die Anforderungs-URI 'http://localhost/Test/odata/Orders(1)/OrderDetails/ $ ref' passt", "innererror": { "message" : "Es wurde keine Routingkonvention gefunden, um eine Aktion für den OData-Pfad mit der Vorlage '~/entityset/key/navigation/$ ref' auszuwählen.", "Type": "", "stacktrace": ""}}}
Nun führte mich eine schnelle Websuche zu diesem Artikel Entity Relations in OData v4 Using ASP.NET Web API 2.2
Dieser Artikel sagt, ich muss eine "CreateRef" in der Orders-Controller hinzufügen.
Ich habe eine "CreateRef" in der Bestellung Controller und sicher genug, es wird aufgerufen, aber der Artikel geht davon aus, dass die OrderDetail in der Datenbank vorhanden ist.
Das json OrderDetail-Objekt wird nicht gebucht.
Runde 3
// Add the new item with a link to the related Order
context.AttachTo("OrderDetails", newOrderDetail);
// Attach a link between Order and the new OrderDetail
context.AttachLink(order, "OrderDetails", newOrderDetail);
// Add the new order detail to the collection
order.Order_Details.Add(newOrderDetail);
newOrderDetail.Order = order;
Nun scheint dies viel besser.
Kein Fehler, aber es hat nicht vollständig funktioniert.
Es wurde ein PUT an die/odata/OrderDetails (0) gesendet und es wurde das json OrderDetail Objekt gesendet, ABER das sollte ein POST kein PUT sein.
Ich fühle, dass ich so nah bin, aber ich kann nicht scheinen, herauszufinden, wie es richtig funktioniert.
Irgendwelche Ideen?
Danke für die Informationen, aber nach Versuch und Irrtum konnte ich die Antwort finden. Es war ein Problem auf der Client-Seite in der Art, wie ich versuchte, das Kind dem Elternteil hinzuzufügen. – goroth