Visualizzazione dei risultati da 1 a 10 su 25

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Chiamo più saveChanges() perchè ho necessità di recuperare l'ID del nuovo record inserito nella tabella "padre" in modo da collegare i nuovi record della tabella figlio con la F.Key.

    L'errore comunque era qui:
    codice:
    For i = 0 To rate - 1
                    With mov
                        .data_Mov = dataMov.AddMonths(freq)
                        .effettuato_Mov = effettuatoMov
                        .idInOut_Mov = inOut.id_InOut
                    End With
                    myDB.movimenti.Add(mov)
                Next
    Mi sono accorta dopo che stavo inserendo lo stesso movimento più volte alchè ho corretto così:

    codice:
        For i = 0 To rate - 1
                    Dim newMov As New movimenti
                    With newMov
                        .data_Mov = dataMov.AddMonths(freq)
                        .effettuato_Mov = effettuatoMov
                        .idInOut_Mov = inOut.id_InOut
                    End With
                    myDB.movimenti.Add(newMov)
                Next
    Ed ora funziona!
    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?).

    Per la cronaca:

    If idMov > 0 Then mov = myDB.movimenti.Where(Function(m) m.id_Mov = idMov).Single
    End If
    // ...
    Questo codice serve perchè uso lo stesso form sia per aggiungere che modificare e in caso di modifica carico i dati del record da modificare (ma anche questo era sbagliato e l'ho corretto).
    Essendo "mov" un set di record "figli" nel momento in cui modifico il padre li elimino tutti e riscrivo i nuovi in base ai dati inseriti nell'interfaccia dall'utente. Ma questa è un'altra storia!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Chiamo più saveChanges() perchè ho necessità di recuperare l'ID del nuovo record inserito nella tabella "padre" in modo da collegare i nuovi record della tabella figlio con la F.Key.
    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:
    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()
    Il procedimento corretto è il seguente:
    codice:
    Dim f As New Fattura()
    myDB.Fattura.Add(f)
    ' ...
    Dim d As New FatturaDettaglio()
    d.Fattura = f
    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().

    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.

    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?).
    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.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Cavolo! Non conoscevo questo metodo! Grazie 1000!!

    Per l'altro problema no non credo dipenda da questo perchè io creo semplicemente una list(of T) di entità e poi chiedo il removeRange su quella lista ma mi da errore!

    codice:
       Dim lstToDel As List(Of movimenti) = myDB.movimenti.Where(Function(m) idToDel.Contains(m.id_Mov)).ToList
                myDB.movimenti.RemoveRange(lstToDel)
                myDB.SaveChanges()
    idToDel è una list(of intenger) contenente la lista di id_Mov

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Per l'altro problema no non credo dipenda da questo perchè io creo semplicemente una list(of T) di entità e poi chiedo il removeRange su quella lista ma mi da errore!
    L'errore qual è?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Quote Originariamente inviata da alka Visualizza il messaggio
    L'errore qual è?
    Table 'finanze.finanze.movimenti' doesn't exist"


    se serve però ti incollo tutta l'eccezione

  6. #6
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    il codice completo è questo:

    codice:
      Dim myDB As EF_DB = creaMyDB()
            Try
                Dim lstToDel As List(Of movimenti) = myDB.movimenti.Where(Function(m) idToDel.Contains(m.id_Mov)).ToList
                myDB.movimenti.RemoveRange(lstToDel)
                myDB.SaveChanges()
                MsgBox("Movimenti Eliminati", MsgBoxStyle.Information, "Operazione Effettuata")
                out = True
            Catch ex As Exception
                errMsg(ex)
            Finally
                killMyDB(myDB)
            End Try
    le 2 sub che richiamo (creaMyDB e killMyDB) sono queste:

    codice:
        Function creaMyDB() As EF_DB
            Return New EF_DB
        End Function
    
        Function killMyDB(ByVal myDB As EF_DB) As Boolean
            myDB.Dispose()
            Return IsNothing(myDB)
        End Function

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da Veronica80
    Table 'finanze.finanze.movimenti' doesn't exist"
    Non è che questi record lasciano degli orfani all'interno del DB, ossia record che puntano a essi e così non hanno più a disposizione il figlio nella relazione?

    Quote Originariamente inviata da Veronica80
    il codice completo è questo [...]
    Il valore di ritorno booleano non ti serve a nulla: se si verifica un errore, è l'eccezione che deve "uscire" e veicolare questa condizione, gestendola all'esterno della procedura anche con la visualizzazione di un messaggio; inserendola qui, sei costretta sempre a testare il valore booleano di ritorno complicando il codice, e a gestire in un sol modo l'errore, mentre magari all'esterno potresti voler cambiare idea o fare qualcosa di più.

    le 2 sub che richiamo (creaMyDB e killMyDB) sono queste [...]
    Anche queste due sub non ti servono a nulla e complicano soltanto: la prima fa solamente una New senza particolari aggiunte, la seconda chiama Dispose (che è corretto) e restituisce sempre un booleano inutile, anche perché sarà sempre "True" in quanto myDB è diverso da Nothing, sebbene rimanga inutilizzabile poiché hai fatto Dispose() dell'oggetto a cui la variabile fa riferimento, quindi è pure fuorviante.

    Semplificare, semplificare, semplificare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Quote Originariamente inviata da alka Visualizza il messaggio
    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.

    Ciao!
    Si lo so ma non trovo una guida esaustiva e comprensibile per me

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.