2 messaggi dal 28 marzo 2017
Ciao a tutti,

esiste un modo per "ripulire" il contesto Entity Framework da modifiche che, al salvataggio, non sono andate a buon fine, senza dover chiudere e ricreare la connessione al DB? Altrimenti, se si riprova a salvare, l'operazione fallirà sempre finché ci sono quelle modifiche in sospeso.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alex,
ripulire le modifiche significa alterare lo stato delle entità tracciate dal DbContext:
  • Le entità che sono in stato Modified tornano ad assumere i loro valori originali e il loro stato diventa Unchanged;
  • Le entità in stato Deleted tornano ad essere unchanged;
  • Le entità in stato Added vengono staccate dal contesto.

Prova a creare un metodo RejectChanges nel DbContext che elenchi tutte le entità tracciate dal contesto e cambi lo stato come descritto sopra. Vedi un esempio qui:
https://stackoverflow.com/questions/10535377/dbcontext-and-rejectchanges/22097132#answer-22097132

In alternativa, se vuoi evitare di ricreare la connessione, puoi aprirla tu e passarla al costruttore del DbContext: se le modifiche non vanno a buon fine lo distrutti e ne ricrei un altro passandogli la stessa connessione. Se preferisci questo approccio, usa il costruttore che accetta la DbConnection e il boolean che trovi documentato qui:
https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.dbcontext(v=vs.113).aspx#M:System.Data.Entity.DbContext.

Comunque, qual è il tuo scenario? Perché vuoi buttar via le modifiche? Fai attenzione al tipo di eccezione che si verifica. Se è una DbUpdateException, vai a vedere se la sua inner expection è di tipo SqlException. In questo caso potrebbe essere che il salvataggio è fallito perché il db era temporaneamente non raggiungibile, e non perché i dati non fossero validi.

ciao,
Moreno
Modificato da BrightSoul il 10 maggio 2018 14.09 -

Enjoy learning and just keep making
2 messaggi dal 28 marzo 2017
Ciao Moreno, nel caso specifico so qual è l'errore che si verifica, e volendo anche come evitarlo, essendo una banale eccezione di chiave primaria duplicata dovuta all'arrivo di dati scorretti. Il mio obiettivo, però, è non solo evitare di controllare se il dato esista già prima di ogni inserimento (che mi sembra molto inefficiente), ma anche fare un codice più generico che sia in grado di gestire la situazione per qualsiasi errore dipendente dai dati. Vorrei evitare di fare Dispose() e reistanziare il contesto perché non mi sembra una soluzione concettualmente corretta, e anche perché se i dati scorretti in arrivo sono molti, la connessione verrebbe ricreata continuamente.
Avevo in mente di andare a modificare a mano lo stato delle entità, ma appunto perché a mano, la cosa non mi convinceva (in altre parole, se nel framework non è inclusa una funzione che fa questa cosa, probabilmente un motivo c'è  ).
Comunque grazie, credo che adotterò questa soluzione!

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.