2012-10-30 17 views
8

Entity Framework 5.0 Codice prima con database esistente. Reverse ha progettato le classi con utensili elettrici. Tutto funziona alla grande. Il database ha due tabelle. Un genitore e un bambino con chiave esterna di nuovo all'ID padre. Gli ID sono tutti int con l'incremento automatico. Ho aggiunto un numero di record padre e ora voglio aggiungere record figlio a genitori specifici. L'unico modo che posso vedere per farlo è trovare l'ID genitore appropriato ricercando la tabella dei genitori per un nome o un'altra proprietà e restituire l'ID. Quindi utilizzare quell'ID nella proprietà della chiave esterna quando si aggiunge il figlio. Non voglio creare un nuovo genitore, quindi questo è l'unico modo per aggiungere un figlio a un genitore esistente? Tutti gli esempi di internet sembrano aggiungere un bambino con l'aggiunta di un nuovo genitore e non aggiungere un figlio a un genitore esistente. Qualsiasi aiuto sarebbe molto apprezzatoEntity Framework - Aggiungi entità figlio

+0

Per impostare un ente collegato si imposta sia la proprietà di navigazione per la controllante o si imposta la chiave esterna. Se conosci l'ID e non hai il genitore solo la chiave esterna. Se hai l'oggetto genitore, imposta la proprietà di navigazione. Se non conosci l'ID né l'oggetto genitore, come fai a sapere a quale genitore è correlata l'entità figlia? – Pawel

+0

Lasciami provare con un esempio. Diciamo che l'entità genitore è insegnanti e io ho Bob, Julie e Dave nel db. L'entità figlio è classi con una relazione tra un insegnante e molte classi. Voglio aggiungere un corso a Julie ma non ho il suo ID principale perché è stato creato automaticamente pochi giorni fa quando l'ho inserito. Quindi, devo cercare la proprietà del nome dell'insegnante per "Julie" e restituire il suo ID principale e quindi usarlo come chiave esterna della nuova classe? – user1626137

+0

L'unico modo per identificare Julie è utilizzare l'ID. La ragione di ciò è che l'ID è sempre univoco perché il nome non lo è. È possibile portare l'entità dal database utilizzando un codice come 'context.Teachers.First (t => t.Name ==" Julie ") e utilizzare l'ID o il riferimento. Non c'è altro modo di stabilire una relazione in quanto non si sa a cosa impostare la relazione. Si noti inoltre che Julie potrebbe essere stata eliminata nel frattempo. – Pawel

risposta

22

"Julie" (Lerman) sembra essere uno dei nostri insegnanti quando si tratta di EF. Come spiega nel suo libro DbContext ci possono essere tre proprietà coinvolte in un'associazione genitore-figlio, due proprietà di navigazione (parent.Children, child.Parent) e una proprietà di chiave esterna (child.ParentId). È possibile impostare una di queste o qualsiasi combinazione di esse nel codice.

Quando EF viene attivato per rilevare le modifiche (per esempio quando viene richiamato SaveChanges) avvia un processo chiamato rapporto correzione che assicura che le tre proprietà saranno sincronizzati.

così hai tre opzioni per aggiungere un'entità figlio per un genitore:

  1. child.Parent = parentObject. L'oggetto genitore dovrebbe essere prima prelevato dal database.
  2. parentObject.Children.Add(child). Richiede anche un oggetto padre preesistente dal database.
  3. child.ParentId = parentId, per il quale si solo bisogno di conoscere l'ID. Puoi ottenere l'Id nel modo che hai suggerito, ma altrettanto bene, per gli oggetti che conosci non saranno cancellati, puoi averli salvati in alcune variabili per riutilizzarli attraverso le transazioni.

Con le prime due opzioni l'oggetto figlio non deve essere aggiunto manualmente al contesto. EF sa abbastanza per vedere che è nuovo. Con la terza opzione deve essere aggiunto a context.Children prima del SaveChanges.

+0

Ho contrassegnato questo come risposta e indico anche il commento di Pawel che entrambi confermano la mia supposizione che ho bisogno dell'entità genitore o almeno dell'ID genitore prima di poter aggiungere un figlio. Post scriptum Ho tutti i libri e gli esempi di Julie che sono stati di grande aiuto durante l'apprendimento di Entity Framework. – user1626137

Problemi correlati