EDIT-2: Nach Stunden der Forschung und fast jeder odata bezogenen Link auf Google drehen lila, fand ich heraus, dass das Konzept der 'Deep-Einsätze' (link) existiert in der OData-Spezifikation. Also, was ich mache, sollte auch funktionieren, auch ohne die Links. Kann jemand das auf dem Microsoft OData-Client aktivieren? Gibt es andere OData-Kunden, die dieses Konzept unterstützen?Einfügen von Entities in OData mit erforderlichen Fremdschlüssel
EDIT: Vielleicht ist dies der falsche Ansatz, also bitte sagen Sie mir, wenn ich es total falsch mache. Nicht speichern zu können, blockiert wirklich unseren Fortschritt!
Ich habe ein Problem mit OData v3. Ich habe eine Klasse Associate
, die eine erforderliche Address
hat. Wenn ich versuche, einen neuen Associate zu senden, schlägt es fehl, da die Address
-Eigenschaft null ist (EF6 löst DbUpdateException mit Fremdschlüsselverletzung aus). Meine Associate
Klasse sieht wie folgt aus:
public class Associate
{
public int Id { get; set; }
[Required, StringLength(100)]
public string Name { get; set; }
[Required, StringLength(50)]
public string Role { get; set; }
public bool IsMailReceiver { get; set; }
public bool IsLegalRepresentative { get; set; }
[ForeignKey("AddressId")]
public virtual Address Address { get; set; }
public int AddressId { get; set; }
}
ich mit dem Microsoft OData-Client, und versuche, die Mitarbeiter in der folgenden Art und Weise hinzuzufügen:
var associate = new Associate { /* ... */ };
context.AddObject("Associates", associate);
context.AddObject("Addresses", associate.Address);
/* UI fills associate data */
context.SetLink(associate, "Address", associate.Address);
context.UpdateObject(associate);
context.UpdateObject(associate.Address);
/* at this point the associate has the address set! */
context.SaveChanges(); // << Exception
auf dem Server in der Steuerung, die Associate ankommt ohne den Fremdschlüssel jedoch. Wenn ich die POST-Anfrage mit Fiddler überprüfen, sehe ich, warum:
{
"odata.type" : "xxx.Data.Entities.Associate",
"AddressId" : 0,
"Id" : 0,
"IsLegalRepresentative" : false,
"IsMailReceiver" : false,
"Name" : "John Doe",
"Role" : "Father"
}
Die Adresse nicht übertragen wird, auch wenn die erzeugte Klasse auf dem Client eine Address
Eigenschaft hat.
Wie kann ich dieses Problem lösen?
siehe erstellen Haben Sie das Entity Framework-Modell richtig eingerichtet, um die AddressId Eigenschaft auf die Krawatte Adresseinheit? Oft vergesse ich das, damit meine Eigenschaft nicht korrekt mit dem Fremdschlüssel verknüpft wird. –
@TheSenator Die Adresse ist auch neu, deshalb brauche ich das materialisierte Objekt auf der Serverseite, damit EF den Rest verwalten kann (wie es so gut geht). – LueTm
Wie senden Sie die JSON POST-Anfrage vom Client? Genauer gesagt, wie wird die Associate/Address auf der Client-Seite serialisiert? – nXu