Sto usando Entity Framework 6.2, in codice prima. Ho queste due classi:
public class Agent
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? AgentId { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
public int OfficeId { get; set; }
[ForeignKey("OfficeId")]
public virtual Office Office { get; set; }
}
e
public class Office
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int OfficeId { get; set; }
public string Agency { get; set; }
public string Branch { get; set; }
[InverseProperty("Office")]
public virtual ICollection<Agent> Agents { get; set; }
}
Quindi ogni agente appartiene a un ufficio (e solo a un ufficio). Al contrario, un ufficio può contenere molti agenti.
La mia app si collega a un'API Web, che la alimenta con dati XML con agenti e uffici (io uso XDocument per questo). Quindi popolo il mio DbContext con questi oggetti e chiamo dbContext.SaveChanges ();
A quel punto, ottengo questo errore:
"Impossibile aggiungere o aggiornare una riga
FK_agent_office_OfficeId
: un vincolo di chiave esterna non riesce (fusion
.agent
, CONSTRAINTFK_agent_office_OfficeId
FOREIGN KEY (OfficeId
)office
REFERENCES (OfficeId
) ON DELETE CASCADE ON UPDATE CASCADE)"
Mi sembra che EF stia cercando di salvare gli agenti prima degli uffici. Pertanto, quando scrive il primo agente nel database, non esiste un ufficio corrispondente e la transazione non riesce. Immagino che EF capirebbe l'ordine corretto delle cose (basato sulle proprietà di navigazione) e salverà le cose nell'ordine corretto?
Ora, devo precisare che, quando la mia app ha aggiunto gli agenti e gli uffici a DbContext, ha aggiunto prima gli agenti e poi gli uffici, e questo è forse il motivo per cui EF li sta anche inserendo nel database nello stesso ordine. Sfortunatamente, quando la mia app chiama l'API Web, l'API mi invia prima dati XML con agenti e poi uffici.
Come posso rendere EF salvare gli uffici prima degli agenti?
EF esegue l'ordine corretto in base alle proprietà di navigazione. Qualcos'altro è sbagliato. Alcune cose potrebbero essere il problema.
Perché stai usando [DatabaseGenerated(DatabaseGeneratedOption.None)]
? Stai creando e gestendo gli id o il database? Se il database non lo si desidera [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
?
Anche una chiave primaria nullable sull'agente? È corretto? Le chiavi primarie non possono / non devono essere annullabili ...
Non dovrebbe essere necessario impostare [InverseProperty("Office")]
per una normale relazione da 1 a molti. Questo potrebbe confondere EF.