62 messaggi dal 22 ottobre 2012
Ti ringrazio molto del consiglio.

Solo un'ultima cosa, secondo te devo gestire nell'evento anche l'eventuale eccezione che potrebbe generarsi al SaveChanges, in pratica creare una classe tipo quella che mi avevi indicato la ...EntityDataSourceChangedEventArgs ?
Modificato da rubinim il 29 luglio 2014 09.11 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

rubinim ha scritto:
devo gestire nell'evento

Non nell'evento perché viene sollevato solo dopo che il SaveChanges è andato a buon fine.

Dovresti sì, mettere un blocco try ... catch attorno al SaveChanges per catturare l'eventuale DbUpdateException che potrebbe verificarsi. A quel punto, o scrivi del codice per provare a sistemare il problema, oppure rilanci un nuovo tipo di eccezione che potrebbe essere più comprensibile per l'utente.
Esempio:
try {
  contesto.SaveChanges();
} catch (DbUpdateException exc){
  //exc diventa la InnerException di questa nuova eccezione che andiamo a lanciare
  throw new SalvataggioException("Non è stato possibile salvare i dati, riprova più tardi", exc);
}

Ovviamente, in caso di eccezione, l'evento non verrà sollevato ed è giusto che sia così perché l'inserimento non è di fatto avvenuto.

ciao,
Moreno
Modificato da BrightSoul il 30 luglio 2014 00.17 -

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Ho creato una classe :

Public Class clsEntityChangedEventArgs

    Public Property Context As Engine.ModelEntities
    Public Property Entity As Object
    Public Property Exception As Exception
   
End Class


Cosa ne dici se la funzione di Insert fosse cosi :

 Public Sub InsertT1(item As Engine.T1)

        Dim e As New clsEntityChangedEventArgs
        db.T1.Add(item)

        Try
            db.SaveChanges()

            'Raise Event
            With e
                .Context = db
                .Entity = item
                .Exception = Nothing
            End With
            RaiseEvent T1Inserted(Me, e)

        Catch ex As DbUpdateException
            With e
                .Context = db
                .Entity = Nothing
                .Exception = ex
            End With
            RaiseEvent T1Insered(Me, e)
        End Try

    End Sub


cosi poi all'interno della funzione scatenata dall'evento gestisco anche la visualizzazione dell'errore.
11.886 messaggi dal 09 febbraio 2002
Contributi
Mmh, no. Si capisce che questo scenario potrebbe essere modellato meglio perché l'oggetto clsEntityChangedEventArgs ha delle proprietà che hanno senso solo in certi casi. La proprietà Exception viene valorizzata solo se si è verificata un'eccezione (e infatti la setti a Nothing quando invece l'inserimento è andato a buon fine). E viceversa anche Entity.

La stessa cosa vale anche per l'evento: non possiamo sollevare un evento chiamato "Inserted" quando invece l'inserimento non è andato a buon fine. E' proprio una questione di semantica più che di tecnica.

Allora potresti sollevare due eventi: il primo per informare la UI che l'inserimento è avvenuto e il secondo per notificare un'eccezione. Potresti avere quindi un evento T1Inserted e un evento T1Exception.

Oppure mantieni soltanto T1Inserted, e lascia propagare l'eccezione, in modo che la UI sia libera di gestirla se e come vuole.
Anzi, piuttosto che lasciar propagare la DbUpdateException, potresti wrapparla in una tua eccezione che sia più significativa per l'utente.

ciao,
Moreno

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Perfetto, grazie del consiglio, sempre molto gentile.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.