Connessione e disconnessione di oggetti (Entity Framework)

In Entity Framework gli oggetti possono essere connessi o disconnessi da un contesto dell'oggetto. Gli oggetti connessi a un contesto dell'oggetto vengono rilevati e gestiti da quel contesto dell'oggetto. Il contesto dell'oggetto non fa riferimento agli oggetti disconnessi e le relative risorse possono essere recuperate da .NET Framework. In questo argomento vengono descritte le modalità di connessione e disconnessione degli oggetti e alcune considerazioni su come eseguire tali operazioni.

Connessione di oggetti

Quando una query viene eseguita in un contesto dell'oggetto in Entity Framework , gli oggetti restituiti vengono automaticamente connessi al contesto dell'oggetto. È possibile inoltre connettere a un contesto dell'oggetto gli oggetti ottenuti da un'origine diversa da una query. È possibile connettere gli oggetti che in precedenza sono stati disconnessi, gli oggetti restituiti da una query NoTracking o gli oggetti ottenuti all'esterno del contesto dell'oggetto. È inoltre possibile connettere gli oggetti archiviati nello stato di visualizzazione di un'applicazione ASP.NET o restituiti da una chiamata al metodo remota o da un servizio Web.

Utilizzare uno dei metodi seguenti per connettere l'oggetto a un contesto dell'oggetto:

Membro Descrizione

System.Data.Objects.ObjectSet.AddObject(

o

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

Aggiunge un oggetto e i relativi oggetti correlati all'oggetto ObjectContext e imposta gli oggetti entità sullo stato Added. In questo stato gli oggetti entità non devono disporre di valori di chiave univoca. I valori di chiave temporanea vengono assegnati alle proprietà chiave e vengono aggiornati con i valori generati dall'origine dati dopo avere salvato gli oggetti. Una volta aggiunti gli oggetti, modificare in modo appropriato lo stato degli oggetti entità.

System.Data.Objects.ObjectSet.Attach(

o

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

e

AttachTo

Aggiunge un oggetto all'oggetto ObjectContext e imposta l'oggetto sullo stato Unchanged. Nello stato Unchanged i valori della chiave dell'entità vengono trattati come finali in Entity Framework . Se più entità di un determinato tipo dispongono dello stesso valore di chiave, in Entity Framework verrà generata un'eccezione. Per evitare questa situazione, utilizzare il metodo AddObject per connettere gli oggetti disconnessi e modificare quindi in modo appropriato lo stato.

Gli oggetti vengono connessi al contesto dell'oggetto in un stato Unchanged. Se è necessario modificare lo stato di un oggetto o la relazione in quanto si è certi che lo stato dell'oggetto è stato modificato in Detached, utilizzare uno dei metodi seguenti.

Membro Descrizione

ChangeObjectState

Modifica un'entità o una relazione in un nuovo stato (ad esempio Added o Modified). Questa modifica può influire sulle relazioni di cui fa parte un'entità. Lo spostamento di un'entità nello stato Added, ad esempio, comporterà lo spostamento anche di qualsiasi relazione invariata nello stato Added. Allo stesso modo, contrassegnando un'entità come Modified, tutti i valori scalari verranno contrassegnati come Modified.

È possibile utilizzare anche il metodo ChangeState dell'oggetto ObjectStateEntry.

ChangeRelationshipState

Modifica la relazione esistente tra due entità nello stato specificato. Se non esiste alcuna relazione tra le entità, questo metodo consentirà di crearne una nuova nello stato specificato. Questo metodo non è supportato per relazioni basate su un'associazione di chiavi esterne. Per ulteriori informazioni, vedere Definizione e gestione delle relazioni (Entity Framework).

È possibile utilizzare anche il metodo ChangeObjectState dell'oggetto ObjectStateEntry.

ChangeState

Il comportamento di questo metodo equivale a quello del metodo ChangeObjectState o ChangeRelationshipState a seconda che l'oggetto ObjectStateEntry sia un oggetto o una relazione.

SetModifiedProperty

Imposta le singole proprietà sullo stato Modified. Utilizzare questo metodo quando si conoscono le proprietà modificate anziché impostare l'intera entità da modificare.

Se i valori delle proprietà dell'oggetto che viene connesso sono stati aggiornati, utilizzare uno dei seguenti metodi:

Membro Descrizione

System.Data.Objects.ObjectSet.ApplyCurrentValues(

o

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

Copia i valori scalari dall'oggetto fornito nell'oggetto dell'oggetto ObjectContext con la stessa chiave. Tutti i valori che differiscono da quelli originali saranno contrassegnati come modificati.

Se si dispone di un grafico con i valori correnti e si desidera applicare i valori originali, chiamare il metodo ApplyOriginalValues.

È possibile utilizzare anche il metodo ApplyCurrentValues dell'oggetto ObjectStateEntry.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

o

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

Copia i valori scalari dall'oggetto fornito nel set di valori originali per l'oggetto nell'oggetto ObjectContext con la stessa chiave. Tutti i valori che differiscono da quelli correnti saranno contrassegnati come modificati.

È possibile utilizzare anche il metodo ApplyOriginalValues dell'oggetto ObjectStateEntry.

SetModifiedProperty

Imposta le singole proprietà sullo stato Modified. Utilizzare questa proprietà quando si conoscono le proprietà modificate anziché impostare l'intera entità da modificare.

GetUpdatableOriginalValues

Ottiene l'istanza dell'oggetto OriginalValueRecord che rappresenta la versione aggiornabile dei valori originali dell'oggetto associato a questo oggetto ObjectStateEntry. Utilizzare l'istanza restituita dell'oggetto OriginalValueRecord per leggere o aggiornare le proprietà originali dell'oggetto singolarmente.

CurrentValues

Ottiene l'istanza dell'oggetto CurrentValueRecord che rappresenta i valori correnti dell'oggetto associato a questo oggetto ObjectStateEntry. Utilizzare l'istanza restituita dell'oggetto CurrentValueRecord per leggere o aggiornare le proprietà correnti dell'oggetto singolarmente.

Considerazioni sulla connessione di oggetti

Le considerazioni seguenti riguardano la connessione di oggetti al contesto dell'oggetto:

  • Se l'oggetto che viene connesso ha oggetti correlati, anche tali oggetti vengono connessi al contesto dell'oggetto.

  • Se l'oggetto connesso non è presente nell'origine dati, non viene aggiunto durante l'esecuzione del metodo SaveChanges. In questo caso, quando vengono apportate modifiche alle proprietà, si verifica un'eccezione nel server durante l'esecuzione del metodo SaveChanges. Per aggiungere un oggetto, utilizzare il metodo System.Data.Objects.ObjectSet.AddObject( o System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

    Se l'oggetto che viene connesso è correlato ad altri oggetti, è necessario definire in modo esplicito le relazioni in uno dei modi descritti in Definizione e gestione delle relazioni (Entity Framework). Per ulteriori informazioni, vedere Procedura: connettere oggetti correlati (Entity Framework).

  • L'oggetto passato al metodo Attach deve avere un valore EntityKey valido. Se l'oggetto non ha un valore EntityKey valido, utilizzare il metodo AttachTo per specificare il nome del set di entità.

  • Se un oggetto da connettere presenta un oggetto EntityKey identico a quello di un altro oggetto già presente nel contesto dell'oggetto, si verifica un'eccezione InvalidOperationException. Questo errore non si verifica se un oggetto nel contesto presenta la stessa chiave ma è nello stato Added.

Disconnessione di oggetti

In applicazioni Entity Framework è possibile disconnettere oggetti dal contesto dell'oggetto. È possibile disconnettere oggetti per risparmiare risorse, in quanto l'esecuzione di query ripetute nello stesso contesto dell'oggetto determina l'aumento dei requisiti di memoria del contesto dell'oggetto. La connessione di oggetti al contesto dell'oggetto può essere evitata eseguendo una query con un valore MergeOption di NoTracking oppure è possibile disconnetterli chiamando il metodo System.Data.Objects.ObjectSet.Detach( o System.Data.Objects.ObjectContext.Detach(System.Object) e passando un riferimento all'oggetto disconnesso, come nell'esempio seguente:

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

Considerazioni sulla disconnessione di oggetti

Le considerazioni seguenti riguardano la disconnessione di oggetti:

  • Detach ha effetto solo sull'oggetto specifico passato al metodo. Se l'oggetto che viene disconnesso ha oggetti correlati nel contesto dell'oggetto, tali oggetti non vengono disconnessi.

  • In un'associazione indipendente le informazioni sulle relazioni non sono gestite per un oggetto disconnesso.

  • Le informazioni sullo stato dell'oggetto non vengono conservate quando un oggetto viene disconnesso. Sono inclusi i valori di chiave temporanea e le modifiche rilevate.

  • La disconnessione degli oggetti non influisce sui dati presenti nell'origine dati.

  • Le direttive di eliminazione a catena e i vincoli referenziali in una relazione di identificazione non vengono applicati durante un'operazione di disconnessione.

  • I vantaggi della disconnessione di oggetti devono essere valutati rispetto ai requisiti aggiuntivi di elaborazione necessari per eseguire l'operazione. Quando l'ambito dei dati utente viene modificato, ad esempio visualizzando un nuovo modulo con un set di dati diverso, è consigliabile creare una nuova istanza dell'oggetto ObjectContext, anziché disconnettere solo gli oggetti da un oggetto ObjectContext esistente.

Per ulteriori informazioni, vedere Procedura: disconnettere oggetti da un contesto dell'oggetto (Entity Framework).

In questa sezione

Procedura: connettere oggetti correlati (Entity Framework)

Procedura: applicare le modifiche apportate a un oggetto disconnesso (Entity Framework)

Procedura: disconnettere oggetti da un contesto dell'oggetto (Entity Framework)

Vedere anche

Concetti

Compilazione di applicazioni a più livelli (Entity Framework)