Ciao, non funziona, infatti il mio caso è differente rispetto all'eccezione generata a causa di un inserimento NonOttimistico nel database.
Io parlo di un eccezione qualunque causata da un fallimento nella chiamata di SaveChanges.
Non voglio generare per questo progetto alcuna verifica lato client o middle tier, voglio lavorare in modo data-centric puro, il client deve essere perfettamente ignorante, pertanto può tentare di inserire o modificare record che violano i vincoli del database, se ci riesce bene, altrimenti deve dire all'utente "Spiacente non è possibile".
Se chiamo SaveChanges dopo avere tentato di inserire un record errato in una tabella, che non possa essere accettato perchè duplicherebbe una primary key.. giustamente SaveChanges fallisce e l'eccezione sollevata fornisce un messaggio più che sufficiente per l'utente.
Ora io voglio soltanto che il datacontext locale ritorni allo stato precedente all'inserimento del record errato.
Ho cercato lungamente in rete, e vedo che diverse persone si lamentano della mancanza di un metodi tipo DataContext.DiscardAllChanges() la cosa migliore sarebbe una cosa del tipo
codice:
CheckPoint pippo = DataContext.CreateCheckPoint();
DataContext.Entity.AddObject(Sbagliato);
try{
DataContext.SaveChanges();
}
catch(Exception e)
{
DataContext.DiscardChanges(pippo);
throw e;
}
Questo consentirebbe di creare un client completamente ignorante senza richiedere un ricaricamento dei dati dalla sorgente nel datacontext.
Ad ogni modo per il tipo di applicazione che sto facendo diventa esageratamente complesso andare a smanettare nel ObjectStateManager per implementare manualmente una situazione come quella di cui sopra, pertanto mi va piu che bene ricaricare i dati nel context utilizzando una query con MergeOption = OverwriteChanges... è un ripiego ma per il tipo di client ignorante che intendo fare ce n'è d'avanzo... (parlo di applicazione desktop non applicazione web)
codice:
private Context theContext = new Context();
private Reload()
{
var Query = theContext.Entity.Where("parametri");
...
this.DataContext = Query.Execute(MergeOption.OverwriteChanges);
}
private void TentativoInsert()
{
FormNewRecord r = new FormNewRecord();
r.owner=this;
r.ShowDialog();
theContext.Entity.Add(r.NewRecord);
try{
theContext.SaveChanges();
}
catch(Exception e)
{
Reload();
MessageBox.Show(e.Message);
}
}
Ciao e grazie.