Stati di oggetti e rilevamento di modificheObject States and Change-Tracking

LINQ to SQLLINQ to SQL oggetti sempre associato uno stato. objects always participate in some state. Ad esempio, quando in LINQ to SQLLINQ to SQL viene creato un nuovo oggetto, lo stato dell'oggetto è Unchanged.For example, when LINQ to SQLLINQ to SQL creates a new object, the object is in Unchanged state. Un nuovo oggetto creato dall'utente è noto il DataContext e Untracked dello stato.A new object that you yourself create is unknown to the DataContext and is in Untracked state. Dopo la corretta esecuzione di SubmitChanges, tutti gli oggetti riconosciuti da LINQ to SQLLINQ to SQL sono nello stato Unchanged.Following successful execution of SubmitChanges, all objects known to LINQ to SQLLINQ to SQL are in Unchanged state. La sola eccezione è rappresentata dagli oggetti eliminati dal database che sono nello stato Deleted e di conseguenza inutilizzabili in quell'istanza di DataContext.(The single exception is represented by those that have been successfully deleted from the database, which are in Deleted state and unusable in that DataContext instance.)

Stati degli oggettiObject States

Nella tabella riportata di seguito sono elencati gli stati possibili per gli oggetti LINQ to SQLLINQ to SQL.The following table lists the possible states for LINQ to SQLLINQ to SQL objects.

StatoState DescrizioneDescription
Untracked Un oggetto non registrato da LINQ to SQLLINQ to SQL.An object not tracked by LINQ to SQLLINQ to SQL. Di seguito vengono forniti alcuni esempi:Examples include the following:

-Un oggetto non query tramite l'istanza corrente DataContext (ad esempio un oggetto appena creato).- An object not queried through the current DataContext (such as a newly created object).
-Un oggetto creato tramite deserializzazione- An object created through deserialization
-Un oggetto di cui eseguire una query tramite una diversa DataContext.- An object queried through a different DataContext.
Unchanged Un oggetto recuperato usando l'istanza corrente di DataContext e che non risulta modificato da quando è stato creato.An object retrieved by using the current DataContext and not known to have been modified since it was created.
PossiblyModified Un oggetto che è collegati per un DataContext.An object which is attached to a DataContext. Per ulteriori informazioni, vedere il recupero dei dati e operazioni CUD in applicazioni a più livelli (LINQ to SQL).For more information, see Data Retrieval and CUD Operations in N-Tier Applications (LINQ to SQL).
ToBeInserted Un oggetto non recuperato usando l'istanza corrente di DataContext.An object not retrieved by using the current DataContext. In questo caso viene eseguita un'operazione INSERT in un database durante l'esecuzione di SubmitChanges.This causes a database INSERT during SubmitChanges.
ToBeUpdated Un oggetto che risulta modificato da quando è stato recuperato.An object known to have been modified since it was retrieved. In questo caso viene eseguita un'operazione UPDATE in un database durante l'esecuzione di SubmitChanges.This causes a database UPDATE during SubmitChanges.
ToBeDeleted Un oggetto contrassegnato per l'eliminazione, che causa un'operazione DELETE in un database durante l'esecuzione di SubmitChanges.An object marked for deletion, causing a database DELETE during SubmitChanges.
Deleted Un oggetto eliminato nel database.An object that has been deleted in the database. Questo stato è finale e non consente transizioni aggiuntive.This state is final and does not allow for additional transitions.

Inserimento di oggettiInserting Objects

È possibile richiedere Inserts usando InsertOnSubmit in modo esplicito.You can explicitly request Inserts by using InsertOnSubmit. In alternativa, LINQ to SQLLINQ to SQL in grado di dedurre Inserts mediante la ricerca di oggetti collegati a uno degli oggetti conosciuti che devono essere aggiornati.Alternatively, LINQ to SQLLINQ to SQL can infer Inserts by finding objects connected to one of the known objects that must be updated. Ad esempio, se si aggiunge un Untracked l'oggetto in un EntitySet<TEntity> o impostare un EntityRef<TEntity> per un Untracked dell'oggetto, si apportano le Untracked oggetto raggiungibile mediante gli oggetti rilevati nel grafico.For example, if you add an Untracked object to an EntitySet<TEntity> or set an EntityRef<TEntity> to an Untracked object, you make the Untracked object reachable by way of tracked objects in the graph. Durante l'elaborazione SubmitChanges, LINQ to SQLLINQ to SQL consente di scorrere gli oggetti rilevati e individuato qualsiasi oggetto persistente raggiungibile di cui non vengono rilevate.While processing SubmitChanges, LINQ to SQLLINQ to SQL traverses the tracked objects and discovers any reachable persistent objects that are not tracked. Tali oggetti sono candidati per l'inserimento nel database.Such objects are candidates for insertion into the database.

Per le classi in una gerarchia di ereditarietà, InsertOnSubmit(o) imposta inoltre il valore del membro definito come il discriminatore corrispondere al tipo dell'oggetto o.For classes in an inheritance hierarchy, InsertOnSubmit(o) also sets the value of the member designated as the discriminator to match the type of the object o. Qualora un tipo dovesse corrispondere al valore discriminante predefinito, questa azione causerà la sovrascrittura del valore discriminante con il valore predefinito.In the case of a type matching the default discriminator value, this action causes the discriminator value to be overwritten with the default value. Per ulteriori informazioni, vedere supporto dell'ereditarietà.For more information, see Inheritance Support.

Importante

Un oggetto aggiunto a un oggetto Table non si trova nella cache delle identità,An object added to a Table is not in the identity cache. che riflette solo gli oggetti recuperati dal database.The identity cache reflects only what is retrieved from the database. Dopo una chiamata a InsertOnSubmit, l'entità aggiunta non viene visualizzata nelle query eseguite sul database finché non si completerà SubmitChanges.After a call to InsertOnSubmit, the added entity does not appear in queries against the database until SubmitChanges is successfully completed.

Eliminazione di oggettiDeleting Objects

Per contrassegnare per l'eliminazione un oggetto o rilevato, chiamare DeleteOnSubmit(o) sull'oggetto Table<TEntity> appropriato.You mark a tracked object o for deletion by calling DeleteOnSubmit(o) on the appropriate Table<TEntity>. LINQ to SQLLINQ to SQL prende in considerazione la rimozione di un oggetto da un EntitySet<TEntity> come aggiornamento operazione e il valore di chiave esterna corrispondente viene impostato su null. considers the removal of an object from an EntitySet<TEntity> as an update operation, and the corresponding foreign key value is set to null. La destinazione dell'operazione (o) non viene eliminata dalla relativa tabella.The target of the operation (o) is not deleted from its table. Ad esempio, cust.Orders.DeleteOnSubmit(ord) indica un aggiornamento in cui la relazione tra cust e ord viene interrotta mediante l'impostazione della chiave esterna ord.CustomerID su null.For example, cust.Orders.DeleteOnSubmit(ord) indicates an update where the relationship between cust and ord is severed by setting the foreign key ord.CustomerID to null. Non causa l'eliminazione della riga che corrisponde a ord.It does not cause the deletion of the row corresponding to ord.

LINQ to SQLLINQ to SQL esegue l'elaborazione seguente quando viene eliminato un oggetto (DeleteOnSubmit) rispetto alla relativa tabella: performs the following processing when an object is deleted (DeleteOnSubmit) from its table:

  • Quando si chiama SubmitChanges, per quell'oggetto viene eseguita un'operazione DELETE.When SubmitChanges is called, a DELETE operation is performed for that object.

  • La rimozione non viene propagata agli oggetti correlati, indipendentemente dallo stato di caricamento.The removal is not propagated to related objects regardless of whether they are loaded. In particolare, gli oggetti correlati non vengono caricati per aggiornare la proprietà della relazione.Specifically, related objects are not loaded for updating the relationship property.

  • Dopo la corretta esecuzione di SubmitChanges, gli oggetti vengono impostati sullo stato Deleted.After successful execution of SubmitChanges, the objects are set to the Deleted state. Di conseguenza non sarà possibile usare l'oggetto o il relativo id in un'istanza di DataContext.As a result, you cannot use the object or its id in that DataContext. La cache interna gestita da un'istanza di DataContext non elimina gli oggetti recuperati o aggiunti come nuovi, anche dopo che sono stati eliminati nel database.The internal cache maintained by a DataContext instance does not eliminate objects that are retrieved or added as new, even after the objects have been deleted in the database.

È possibile chiamare DeleteOnSubmit solo su un oggetto registrato da DataContext.You can call DeleteOnSubmit only on an object tracked by the DataContext. Per un oggetto Untracked è necessario chiamare Attach prima di DeleteOnSubmit.For an Untracked object, you must call Attach before you call DeleteOnSubmit. Chiamando DeleteOnSubmit su un oggettoUntracked, verrà generata un'eccezione.Calling DeleteOnSubmit on an Untracked object throws an exception.

Nota

La rimozione di un oggetto da una tabella indica LINQ to SQLLINQ to SQL per generare un database SQL corrispondente DELETE comando al momento della SubmitChanges.Removing an object from a table tells LINQ to SQLLINQ to SQL to generate a corresponding SQL DELETE command at the time of SubmitChanges. Questa azione non rimuove l'oggetto dalla cache, né propaga l'eliminazione agli oggetti correlati.This action does not remove the object from the cache or propagate the deletion to related objects.

Per recuperare l'id di un oggetto eliminato, usare una nuova istanza di DataContext.To reclaim the id of a deleted object, use a new DataContext instance. Per la pulizia degli oggetti correlati, è possibile utilizzare il eliminazione a catena funzionalità del database, altrimenti manualmente eliminare gli oggetti correlati.For cleanup of related objects, you can use the cascade delete feature of the database, or else manually delete the related objects.

Non è necessario, a differenza del database, eliminare gli oggetti correlati in un ordine particolare.The related objects do not have to be deleted in any special order (unlike in the database).

Aggiornamento di oggettiUpdating Objects

È possibile rilevare l'esecuzione di Updates osservando le notifiche delle modifiche,You can detect Updates by observing notifications of changes. che vengono fornite tramite l'evento PropertyChanging nei metodi per l'impostazione delle proprietà.Notifications are provided through the PropertyChanging event in property setters. Quando LINQ to SQLLINQ to SQL riceve una notifica della prima modifica a un oggetto, crea una copia dell'oggetto e lo considera candidato per la generazione di un'istruzione Update.When LINQ to SQLLINQ to SQL is notified of the first change to an object, it creates a copy of the object and considers the object a candidate for generating an Update statement.

Per gli oggetti che non implementano INotifyPropertyChanging, LINQ to SQLLINQ to SQL mantiene una copia dei valori degli oggetti quando prima materializzazione.For objects that do not implement INotifyPropertyChanging, LINQ to SQLLINQ to SQL maintains a copy of the values that objects had when they were first materialized. Quando si chiama SubmitChanges, LINQ to SQLLINQ to SQL confronta i valori originali e correnti per stabilire se l'oggetto è stato modificato.When you call SubmitChanges, LINQ to SQLLINQ to SQL compares the current and original values to decide whether the object has been changed.

Per gli aggiornamenti delle relazioni, il riferimento dal figlio al padre, ovvero il riferimento che corrisponde alla chiave esterna, viene considerato autorevole.For updates to relationships, the reference from the child to the parent (that is, the reference corresponding to the foreign key) is considered the authority. Il riferimento nella direzione inversa, ovvero da padre a figlio, è facoltativo.The reference in the reverse direction (that is, from parent to child) is optional. Le classi di relazione (EntitySet<TEntity> e EntityRef<TEntity>) assicurano che i riferimenti bidirezionali siano coerenti per le relazioni uno-a-molti e uno-a-uno.Relationship classes (EntitySet<TEntity> and EntityRef<TEntity>) guarantee that the bidirectional references are consistent for one-to-many and one-to-one relationships. Se il modello a oggetti non usa EntitySet<TEntity> o EntityRef<TEntity> e se è presente il riferimento inverso, sarà necessario mantenerlo coerente con il riferimento in avanti quando viene aggiornata la relazione.If the object model does not use EntitySet<TEntity> or EntityRef<TEntity>, and if the reverse reference is present, it is your responsibility to keep it consistent with the forward reference when the relationship is updated.

Se si aggiornano sia il riferimento obbligatorio che la chiave esterna corrispondente, è necessario assicurarsi che corrispondano.If you update both the required reference and the corresponding foreign key, you must make sure that they agree. Se non sono entrambi sincronizzati quando si chiama InvalidOperationException, verrà generata un'eccezione SubmitChanges.An InvalidOperationException exception is thrown if the two are not synchronized at the time that you call SubmitChanges. Anche se le modifiche dei valori della chiave esterna sono sufficienti per interessare un aggiornamento della riga sottostante, è necessario modificare il riferimento per mantenere la connettività dell'oggetto grafico e la coerenza bidirezionale delle relazioni.Although foreign key value changes are sufficient for affecting an update of the underlying row, you should change the reference to maintain connectivity of the object graph and bidirectional consistency of relationships.

Vedere ancheSee Also

Informazioni di baseBackground Information
Operazioni di inserimento, aggiornamento ed eliminazioneInsert, Update, and Delete Operations