Non è il modo corretto: per correlare due elementi, è sufficiente assegnare la proprietà di navigazione (ha lo stesso nome della tabella correlata a un elemento) con il riferimento all'oggetto da collegare.
Mi spiego: se voglio salvare una entity Fattura e i suoi dettagli, non devo creare e aggiungere un oggetto Fattura alla Collection relativa, salvare subito le modifiche con SaveChanges() e andare a recuperare l'ID per poter valorizzare il campo "FatturaID" nell'elemento di dettaglio (es. entità FatturaDettaglio).
NON occorre assolutamente quindi fare questo:
Il procedimento corretto è il seguente:codice:Dim f As New Fattura() myDB.Fattura.Add(f) myDB.SaveChanges() ' ... Dim d As New FatturaDettaglio() d.FatturaId = f.Id myDB.FatturaDettaglio.Add(d) myDB.SaveChanges()
Evidenzio quindi la riga con l'istruzione d.Fattura = f dove, tramite la proprietà di navigazione, si stabilisce la relazione tra i due elementi: sarà Entity Framework ad avere cura di prendere l'ID dell'elemento padre e assegnarlo alla proprietà corretta dell'elemento figlio quando viene chiamato il metodo SaveChanges().codice:Dim f As New Fattura() myDB.Fattura.Add(f) ' ... Dim d As New FatturaDettaglio() d.Fattura = f myDB.FatturaDettaglio.Add(d) ' ... myDB.SaveChanges()
Se fossi in uno scenario che richiede l'inserimento di una fattura nella sua interezza, non potrei realizzarlo con la prima versione del codice, poiché in caso di errore su inserimento dei dettagli, la testata mi rimarrebbe comunque, mentre nel secondo caso (che è il modo corretto di procedere) o vengono inseriti correttamente testata e dettagli, o non viene inserito nulla, esattamente come ci si aspetta in un contesto transazionale.
Prova a verificare che la causa non sia da imputare al discorso che ho illustrato, e comunque - probabilmente l'ho già scritto in passato - sono cose da conoscere assolutamente: non si può usare Entity Framework per tentativi, almeno le basi devono essere chiari, altrimenti si rischia di combinare seri pasticci o di mettere in piedi logiche estremamente traballanti, con l'imputazione al framework di una serie di difetti e comportamenti strani che invece sono l'esatto risultato preciso che si può ottenere con il codice errato che viene scritto.In compenso mi sta dando lo stesso identico errore quando provo ad eseguire un semplicissimo "removeRange" (o anche remove multiplo con ciclo for) e non riesco a capire perchè...se volete vi posto qui i dettagli (o apro un altro thread?).
Ciao!![]()



Rispondi quotando