Responsabilità dello sviluppatore nell'override del comportamento predefinito

In LINQ to SQL non vengono applicati i requisiti seguenti, tuttavia il comportamento sarà indefinito se tali requisiti non vengono soddisfatti.

  • Il metodo di override non deve chiamare SubmitChanges o Attach. Se questi metodi vengono chiamati in un metodo di override, LINQ to SQL genera un'eccezione.

  • Non è possibile usare i metodi di override per avviare, eseguire il commit o interrompere una transazione. L'operazione SubmitChanges viene eseguita in una transazione. Una transazione annidata interna può interferire con la transazione esterna. I metodi di override del caricamento possono avviare una transazione solo dopo avere determinano che l'operazione non viene eseguita in Transaction.

  • È previsto che i metodi di override seguano il mapping di concorrenza ottimistica applicabile. Il metodo di override dovrebbe generare un'eccezione ChangeConflictException quando si verifica un conflitto di concorrenza ottimistica. Questa eccezione viene rilevata da LINQ to SQL in modo da consentire la corretta elaborazione dell'opzione SubmitChanges disponibile in SubmitChanges.

  • I metodi di creazione (Insert) e di override Update dovrebbero trasferire di nuovo i valori per le colonne generate dal database ai corrispondenti membri dell'oggetto quando l'operazione viene completata correttamente.

    Ad esempio, se viene eseguito il mapping di Order.OrderID a una colonna di identità (chiave primaria di incremento automatico), il metodo di override InsertOrder() dovrà recuperare l'ID generato dal database e impostare il membro Order.OrderID su tale ID. In modo analogo i membri del timestamp dovranno essere aggiornati in base ai valori di timestamp generati dal database per assicurarsi che gli oggetti aggiornati sono coerenti. La mancata propagazione dei valori generati dal database potrebbe comportare un'incoerenza tra il database e gli oggetti registrati da DataContext.

  • È compito dell'utente richiamare l'API dinamica corretta. Ad esempio, nel metodo di override dell'aggiornamento è possibile chiamare solo ExecuteDynamicUpdate. LINQ to SQL non rileva né verifica se il metodo dinamico richiamato corrisponde all'operazione applicabile. Se viene chiamato un metodo non applicabile, ad esempio ExecuteDynamicDelete per un oggetto da aggiornare, i risultati sono indefiniti.

  • Infine, il metodo di override dovrebbe eseguire l'operazione specificata. La semantica delle operazioni LINQ to SQL, ad esempio il caricamento eager, il caricamento lazy e SubmitChanges, richiedono la fornitura del servizio specificato da parte degli override. Ad esempio, un override di caricamento che restituisce solo una raccolta vuota, senza controllare il contenuto nel database, causerà probabilmente la restituzione di dati incoerenti.

Vedi anche