2009-07-31 11 views
6

Qualcuno può dirmi se/come è possibile convalidare le modifiche in un contesto dati in Linq2Sql prima di chiamando SubmitChanges(). La situazione che ho è che creo un contesto, eseguo più operazioni e aggiungo molti inserti insieme ad altre attività di elaborazione e poi eseguo il rollback se l'invio fallisce.Convalidare Linq2Sql prima di SubmitChanges()

Quello che preferirei fare è fare una specie di chiamata "Validate()" dopo che certe attività sono state fatte in modo che possa gestirlo prima di inviare l'intero lavoro.

risposta

6

per ottenere tutti i cambiamenti in un contesto dati è possibile chiamare

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

Quello che ho è ogni oggetto ha un valore di metodo validate. Io uso attibutes per definire diversi tipi di convalida. Il motivo per cui lo faccio manualmente è perché ho un numero che potrebbe essere un int nel database e nel codice, un valore di 1002 potrebbe non essere valido se risparmio un'età. Quindi posso dare una gamma di valori, ecc. .

Se ognuno degli oggetti valore viene ereditato da un oggetto base, lo rende più semplice. Supponendo che tu abbia nella tua classe base un metodo Validate.

Vorrei sottolineare che funziona correttamente, è necessario modificare il codice generato o eseguire il rollover dei propri oggetti valore. Generalmente arrotolo il mio proprio per come li uso per la convalida.

+0

mai notato il .GetChangeSet() metodo prima! Grazie per quello! +1 – StevenMcD

+0

L'approccio effettivo con cui ho avuto a che fare è stato creare una classe parziale con il nome della tabella e implementare il codice di convalida in OnFooChanging() per i campi che volevo convalidare. Funziona per generare eccezioni immediatamente quando il valore è impostato anziché su SubmitChanges(). Non ho usato il ChangeSet ma mi ha indirizzato nella giusta direzione ed è utile saperlo comunque. –

+0

@Nick - Mi sento inutile dirti questo perché non riesco a ricordare il blog in cui l'ho letto, ma a quanto pare è una buona idea mantenere la convalida separata dai gestori "OnChange", perché consente scenari di convalida complessi, dove la convalida di una proprietà dipende dal valore degli altri, ecc. – Mark

5

È inoltre possibile utilizzare la funzione OnValidate() con la classe parziale dell'entità LINQ-to-SQL. OnValidate() verrà chiamato durante il SubmitChanges() ma prima che i dati vengano inviati al database. Una cosa bella con OnValidate() è che è possibile distinguere tra l'azione CRUD dall'enumerazione ChangeAction.

Per esempio,

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
Problemi correlati