Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,051

    [VB.NET] Errore su Entity Framework con MySQL: tabella non trovata su eliminazione record correlati

    Ciao a tutti mi sta capitando una cosa un po strana...quando vado ad effettuare il saveChanges() col mio modello EF mi da un errore dicendo che non trova la tabella.

    La cosa strana è che la tabella è li...(così come nel DB), ho pensato a un problema di percorsi ma nella funzione che eseguo non manipolo solo quella tabella e sulle altre non mi da problemi!

    Per ora vi posto il codice della funzione che eseguo fatemi sapere se può servire qualcos'altro! perchè darvi un quadro chiaro di tutto è un po complicato senza allegare una marea di cose!!

    codice:
    Function addMov(ByVal idInOut As Integer, ByVal idCatInOut As Integer, ByVal tipoInOut As Boolean, ByVal desInOut As String, ByVal importoInOut As Decimal,
                        ByVal sicuroInOut As Boolean, ByVal idMov As Integer, ByVal dataMov As Date, ByVal effettuatoMov As Boolean, ByVal rate As Integer,
                        ByVal freq As Integer) As Boolean
    
            Dim myDB As EF_DB = creaMyDB()  //Funzione che genera la copia dell'entity
            Dim myTrans As Entity.DbContextTransaction = myDB.Database.BeginTransaction()
    
            Dim out As Boolean = False
            Try
                Dim inOut As New dati_in_out //istanza della tabella dell'entity
                Dim mov As New movimenti //istanza della tabella dell'entity
                If idInOut > 0 Then
                    inOut = myDB.dati_in_out.Where(Function(d) d.id_InOut = idInOut).Single
                End If
                If idMov > 0 Then
                    mov = myDB.movimenti.Where(Function(m) m.id_Mov = idMov).Single
                End If
    
                With inOut
                    .idCat_InOut = idCatInOut
                    .tipo_InOut = tipoInOut
                    .des_InOut = desInOut
                    .importo_InOut = importoInOut
                    .sicuro_InOut = sicuroInOut
                End With
                myDB.dati_in_out.Add(inOut)
                myDB.SaveChanges()  //nessuna eccezione generata su questa chiamata
    
                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
    
                myDB.SaveChanges()  //Questa è la riga che genera l'eccezione
                myTrans.Commit()
                out = True
            Catch ex As Exception
                errMsg(ex)
                myTrans.Rollback()
            Finally
                killMyDB(myDB)
            End Try
            Return out
        End Function
    L'eccezione mi dice che:

    Table 'finanze.finanze.movimenti' doesn't exist"


    Il che, se vogliamo, è anche vero visto che il vero indirizzo dovrebbe essere finanze.movimenti (e non finanze.finanze) come vedere dallo screen fatto in debug durante l'esecuzione della funzione.

    Ma allora perchè sull'altra tabella (dati_in_out) l'errore non si verifica?!?)

    Spero di essermi spiegata bene è davvero complicata
    Immagini allegate Immagini allegate
    Ultima modifica di Veronica80; 10-05-2021 a 13:06

  2. #2
    mmmm sicuro che si possano fare più SaveChanges() ? Non è che l'esecuzione della prima resetta qualcosa?

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,905
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Ciao a tutti mi sta capitando una cosa un po strana...quando vado ad effettuare il saveChanges() col mio modello EF mi da un errore dicendo che non trova la tabella.
    Quando esegui SaveChanges() confermi tutte le operazioni che si sono accumulate nella cosiddetta "Unit of Work", che è il pattern implementato da EF: se hai caricato al suo interno delle entità, queste non sono più disponibili per l'uso in operazioni successive.

    Dovresti usare una unica chiamata a SaveChanges(), se le modifiche che apporti ai vari dati sono correlate, oppure spostare questo pezzo di codice dopo la chiamata alla prima SaveChanges(), in modo da caricare le istanze con cui vuoi interagire nel "nuovo" contesto di lavoro:
    codice:
      If idMov > 0 Then
        mov = myDB.movimenti.Where(Function(m) m.id_Mov = idMov).Single
      End If
      // ...
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  4. #4
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,051
    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!

  5. #5

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,905
    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...

  7. #7
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,051
    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

  8. #8
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,051
    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

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,905
    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...

  10. #10
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,051
    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

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 © 2021 vBulletin Solutions, Inc. All rights reserved.