EDIT-2: Dopo ore di ricerca e di quasi tutti i link correlati odata su google girando viola, ho scoperto che il concetto di 'Deep-inserti' (link) esiste nel Specifica OData. Quindi, dopo tutto, quello che sto facendo dovrebbe funzionare, anche senza i collegamenti. Qualcuno sa come abilitarlo sul client Microsoft OData? Ci sono altri client OData che supportano questo concetto?Inserimento di entità in OData con richieste chiavi esterne
MODIFICA: Forse questo è l'approccio sbagliato, quindi per favore dimmi se lo sto facendo completamente sbagliato. Non essere in grado di salvare blocca davvero i nostri progressi!
Ho un problema con OData v3. Ho una classe Associate
che ha un numero richiesto Address
. Quando provo a POST un nuovo Associato, fallisce a causa della proprietà Address
null (EF6 lancia DbUpdateException con violazione di chiave esterna). La mia classe Associate
si presenta così:
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; }
}
Io uso il client Microsoft OData, e tenta di aggiungere il socio nel seguente modo:
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
Sul server, nel controller, l'Associate arriva senza la chiave esterna, tuttavia. Quando ho ispezionare la richiesta POST con Fiddler, ho capire perché:
{
"odata.type" : "xxx.Data.Entities.Associate",
"AddressId" : 0,
"Id" : 0,
"IsLegalRepresentative" : false,
"IsMailReceiver" : false,
"Name" : "John Doe",
"Role" : "Father"
}
L'indirizzo non viene trasmesso, anche se la classe generata sul client ha una proprietà Address
.
Come posso risolvere questo problema?
Avete configurare il modello Entity Framework per legare correttamente la proprietà AddressId al Indirizzo entità? Spesso mi dimentico di farlo, quindi la mia proprietà non si collega correttamente alla chiave esterna. –
@TheSenator Anche l'indirizzo è nuovo, ecco perché ho bisogno dell'oggetto materializzato sul lato server, quindi EF può gestire il resto (come fa così bene). – LueTm
Come si invia la richiesta POST JSON dal client? Più esattamente, come serializzi l'indirizzo/associato sul lato client? – nXu