Utilizzo delle entità con rilevamento automatico

In un'applicazione Entity Framework il rilevamento delle modifiche nelle entità in un oggetto grafico viene eseguito da un contesto dell'oggetto. Negli scenari a più livelli il contesto dell'oggetto potrebbe tuttavia non essere disponibile sul livello che modifica le entità. A partire da .NET Framework versione 4, le entità con rilevamento automatico consentono di rilevare le modifiche in qualsiasi livello.

Ff407090.note(it-it,VS.100).gifNota:
Utilizzare le entità con rilevamento automatico solo se il contesto dell'oggetto non è disponibile su un livello dove vengono apportate le modifiche all'oggetto grafico. Se il contesto dell'oggetto è disponibile, utilizzare i tipi derivati EntityObject oppure i tipi di oggetti POCO (Plain Old CLR Object)-o i tipi proxy POCO. Per ulteriori informazioni, vedere Utilizzo di oggetti (Entity Framework).

A partire da Microsoft Visual Studio 2010, il modello Generatore di entità con rilevamento automatico ADO.NET genera entità con rilevamento automatico. Questo elemento di modello genera due file con estensione tt (modello di testo): <nome modello>.tt e <nome modello>.Context.tt. Il file *<nome modello>.*tt genera i tipi di entità e una classe helper contenente la logica di rilevamento delle modifiche utilizzata dalle entità con rilevamento automatico, nonché i metodi di estensione che consentono l'impostazione dello stato sulle entità con rilevamento automatico. Il file <nome modello>.Context.tt genera un oggetto ObjectContext tipizzato e una classe di estensioni contenente i metodi ApplyChanges per le classi ObjectContext e ObjectSet. Tali metodi consentono di esaminare le informazioni sul rilevamento delle modifiche contenute nel grafico delle entità con rilevamento automatico per dedurre il set di operazioni che è necessario eseguire per salvare le modifiche nel database. Per ulteriori informazioni, vedere ADO.NET Self-Tracking Entity Generator Template.

Ff407090.Important(it-it,VS.100).gif Nota:
Un servizio non dovrebbe ritenere attendibili le richieste di recuperare o aggiornare dati da un client non attendibile o tramite un canale non attendibile. È necessario autenticare un client: dovrebbe essere utilizzato un canale sicuro o un envelop del messaggio. È necessario convalidare le richieste dei client di aggiornare o recuperare i dati per assicurarsi che siano conformi alle modifiche previste e legittime per lo scenario specificato.

Ff407090.Important(it-it,VS.100).gif Nota:
Evitare di utilizzare informazioni sensibili come chiavi di entità, ad esempio numeri di previdenza sociale. In questo modo si riduce la possibilità di serializzare inavvertitamente informazioni sensibili nei grafici dell'entità con rilevamento automatico in un client che non è completamente attendibile. Con le associazioni indipendenti, la chiave originale di un'entità correlata a quella sottoposta a serializzazione potrebbe essere inviata anche al client.

Metodi di estensione delle entità con rilevamento automatico

A un'entità con rilevamento automatico è possibile applicare i metodi di estensione seguenti. Se si desidera eseguire queste operazioni su un set di entità anziché solo una, vedere Utilizzo di set di entità con rilevamento automatico per ulteriori informazioni.

Metodo StartTracking

Il metodo StartTracking indica alla funzione di rilevamento delle modifiche dell'entità di iniziare a registrare qualsiasi modifica applicata all'entità. Sono incluse le modifiche alle proprietà scalari, alle raccolte e ai riferimenti alle altre entità. Se predisposte, le entità iniziano il rilevamento automatico quando vengono deserializzate nel client tramite Windows Communication Foundation (WCF). Il rilevamento viene inoltre attivato per le entità appena create negli scenari seguenti:

  • Viene creata una relazione tra la nuova entità e un'entità che sta già rilevando le modifiche.

  • Viene chiamato il metodo MarkAs[State] o AcceptChanges su un'entità.

Metodo StopTracking

Il metodo StopTracking interrompe la registrazione delle modifiche.

Metodi MarkAs

Tutti i metodi MarkAs attivano il rilevamento. Questi metodi di estensione facilitano la modifica esplicita dello stato di un'entità in Added, Modified, Deleted e Unchanged.

I metodi MarkAs[State] restituiscono la stessa entità alla quale vengono applicati, con lo stato modificato. Nell'esempio seguente lo stato dell'entità viene modificato in Unchanged:

department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();

Il metodo MarkAsAdded modifica lo stato dell'entità in Added. Le nuove entità con rilevamento automatico vengono create con lo stato Added con il rilevamento delle modifiche non abilitato.

Il metodo MarkAsDeleted modifica lo stato dell'entità in Deleted. Questo metodo cancella anche le proprietà di navigazione sull'entità contrassegnata per l'eliminazione. La proprietà di navigazione viene impostata su null se punta a un oggetto di riferimento. Il metodo Clear viene chiamato se la proprietà di navigazione rappresenta una raccolta. Quando MarkAsDeleted viene chiamato su un oggetto che fa parte di una raccolta, l'oggetto viene rimosso dalla raccolta. Per contrassegnare ogni oggetto di una raccolta come eliminato, contrassegnare gli oggetti in una copia della raccolta. Per ottenere una copia della raccolta, chiamare il metodo ToArray() o ToList() sulla raccolta, come nell'esempio seguente:

List<Course> courses = department.Courses.ToList();

foreach (var c in courses)

{

// Mark each course in the department as Deleted.

c.MarkAsDeleted();

}

Il metodo MarkAsModified modifica lo stato dell'entità in Modified. Inoltre, se si modifica il valore di una proprietà di un'entità per cui è abilitata la funzione di rilevamento delle modifiche, lo stato viene impostato su Modified.

Il metodo MarkAsUnchanged modifica lo stato dell'entità in Unchanged. AcceptChanges inoltre cancella le informazioni sul rilevamento delle modifiche per un'entità e modifica il rispettivo stato in Unchanged.

AcceptChanges

Il metodo AcceptChanges cancella le informazioni sul rilevamento delle modifiche per un'entità e modifica il rispettivo stato in Unchanged. Se si desidera reimpostare lo stato di una relazione, chiamare il metodo AcceptChanges su entrambe entità che partecipano alla relazione.

Metodi di estensione ObjectContext

Il metodo ApplyChanges esamina le informazioni sul rilevamento delle modifiche contenute nel grafico di entità con rilevamento automatico e deduce il set di operazioni che è necessario eseguire per salvare le modifiche nel database. Sono disponibili due metodi ApplyChanges, uno per ObjectContext e l'altro per ObjectSet.

Ff407090.note(it-it,VS.100).gifNota:
Per evitare di propagare messaggi di eccezione che contengono dati sensibili al livello client, le chiamate a ApplyChanges e SaveChanges sul livello server devono essere incapsulate nel codice di gestione delle eccezioni.

Considerazioni relative all'utilizzo delle entità con rilevamento automatico

Quando si utilizzano le entità con rilevamento automatico, tenere presenti le considerazioni seguenti.

  • Verificare che il progetto client disponga di un riferimento all'assembly che contiene i tipi di entità. Se si aggiunge solo il riferimento al servizio al progetto client, il progetto client utilizzerà i tipi proxy WCF e non i tipi di entità con rilevamento automatico effettivi. Ciò significa che non si otterranno le funzioni di notifica automatica che gestiscono il rilevamento delle entità sul client. Se non si desidera includere intenzionalmente i tipi di entità, sarà necessario impostare manualmente le informazioni sul rilevamento delle modifiche sul client affinché le modifiche vengano restituite al servizio.

  • Le chiamate all'operazione del servizio devono essere senza stato e creare una nuova istanza di contesto dell'oggetto. Si consiglia anche di creare il contesto dell'oggetto in un blocco using.

  • Quando si invia al servizio il grafico modificato sul client e si intende continuare a utilizzare lo stesso grafico sul client, si deve scorrere manualmente il grafico e chiamare il metodo AcceptChanges su ogni oggetto per reimpostare la funzione di rilevamento delle modifiche. Se gli oggetti nel grafico contengono proprietà con valori generati da database (ad esempio, valori di identità o concorrenza), Entity Framework sostituirà i valori di queste proprietà con i valori generati da database dopo che viene chiamato il metodo SaveChanges. È possibile implementare l'operazione del servizio in modo che restituisca al client gli oggetti salvati o un elenco di valori di proprietà generati per gli oggetti. Il client dovrebbe quindi sostituire le istanze dell'oggetto o i valori di proprietà dell'oggetto con gli oggetti o i valori di proprietà restituiti dall'operazione del servizio.

  • È possibile che l'unione di grafici da più richieste del servizio introduca oggetti con valori di chiave duplicati nel grafico risultante. Entity Framework non rimuove gli oggetti con chiavi duplicate quando viene chiamato il metodo ApplyChanges, ma genera un'eccezione. Per evitare di avere grafici con i valori di chiave duplicati, seguire uno dei modelli descritti nel blog seguente: Entità con rilevamento automatico: ApplyChanges ed entità duplicate.

  • Quando si modifica la relazione tra oggetti impostando la proprietà della chiave esterna, la proprietà di navigazione di riferimento viene impostata su null e non viene sincronizzata con l'entità principale appropriata sul client. Dopo che il grafico viene collegato al contesto dell'oggetto (ad esempio, dopo avere chiamato il metodo ApplyChanges), le proprietà di chiave esterna e le proprietà di navigazione vengono sincronizzate.

    Non avere una proprietà di navigazione di riferimento sincronizzata con l'oggetto principale appropriato potrebbe essere un problema se è stata specificata l'eliminazione a catena sulla relazione di chiave esterna. L'eventuale eliminazione dell'oggetto principale non sarà propagata agli oggetti dipendenti. Se sono state specificate eliminazioni a catena, utilizzare le proprietà di navigazione per modificare le relazioni anziché impostare la proprietà della chiave esterna.

  • Le entità con rilevamento automatico non sono abilitate per eseguire il caricamento lazy.

  • La serializzazione binaria e la serializzazione agli oggetti di gestione dello stato di ASP.NET non sono supportate dal codice generato dal modello Generatore di entità con rilevamento automatico ADO.NET. Tuttavia, è possibile personalizzare il modello in modo da aggiungere il supporto per la serializzazione binaria. Per ulteriori informazioni, vedere Utilizzo della serializzazione binaria e di ViewState con le entità con rilevamento automatico.

Vedere anche

Attività

Procedura dettagliata: serializzazione di entità con rilevamento automatico (Entity Framework)

Altre risorse

Utilizzo di set di entità con rilevamento automatico
Entità con rilevamento automatico in Silverlight
Utilizzo della serializzazione binaria e di ViewState con le entità con rilevamento automatico