Compilazione di applicazioni a più livelli (Entity Framework)
Entity Framework supporta la serializzazione di oggetti entità in formati che consentono lo scambio remoto e basato su messaggi di tali oggetti, ad esempio quelli utilizzati con i servizi Web e WCF (Windows Communication Foundation). Gli oggetti possono essere serializzati utilizzando la serializzazione binaria, la serializzazione XML e la serializzazione del contratto WCF per consentirne il trasporto utilizzando un flusso binario o protocolli basati su messaggi. Per ulteriori informazioni, vedere Serializzazione di oggetti (Entity Framework). Gli oggetti possono anche essere ricevuti da un messaggio o da un flusso, deserializzati e connessi a un contesto dell'oggetto. Per ulteriori informazioni, vedere Connessione e disconnessione di oggetti (Entity Framework).
ADO.NET Data Services consente di fornire accesso dinamico ai dati di entità in un formato XML che può essere utilizzato dalle applicazioni. Per accedere a tali dati delle entità, utilizzare azioni HTTP REST (Representational State Transfer) standard, quali GET, PUT e POST. Per ulteriori informazioni, vedere ADO.NET Data Services.
Le considerazioni seguenti sono valide per i servizi Web o WCF che utilizzano Entity Framework .
Con la serializzazione binaria e di contratto dati, gli oggetti correlati vengono serializzati insieme all'oggetto primario. Tramite la serializzazione XML, gli oggetti correlati non vengono serializzati. Per la serializzazione delle entità, disabilitare il caricamento lazy. Tramite il caricamento lazy viene eseguita una query per ogni proprietà di navigazione delle relazioni a cui è stato eseguito l'accesso e sia il serializzatore binario sia quello del contratto dati di WCF accedono a tutte le proprietà di navigazione delle relazioni. Tale condizione può causare molte query impreviste durante la serializzazione. Per ulteriori informazioni, vedere Serializzazione di oggetti (Entity Framework).
Sono consigliati i servizi senza stato. I servizi devono essere progettati in modo tale che un contesto dell'oggetto venga mantenuto solo per la durata di una richiesta o di una risposta. Il modello di scambio dei messaggi deve includere informazioni sufficienti per consentire di applicare le modifiche senza che sia necessario rendere persistenti gli oggetti o eseguire nuovamente una query sull'origine dati per recuperare l'oggetto originale. Un servizio che consente a un client di aggiornare gli oggetti deve ad esempio richiedere che l'oggetto aggiornato venga restituito insieme all'oggetto originale. In questo modo, le modifiche possono essere applicate all'oggetto originale dal servizio Web senza che sia necessario recuperare l'oggetto originale dal database o salvarlo in modo permanente in memoria. Per ulteriori informazioni, vedere Procedura: applicare le modifiche apportate a un oggetto disconnesso (Entity Framework).
Gli oggetti vengono sempre deserializzati nello stato Detached. Potrebbe essere necessario connettere o aggiungere l'oggetto a ObjectContext oppure si potrebbe desiderare di applicare le modifiche alle proprietà solo all'oggetto originale. Per ulteriori informazioni, vedere Connessione e disconnessione di oggetti (Entity Framework).
Una volta aggiunti gli oggetti e le relazioni al contesto, è possibile impostare il nuovo stato tramite ChangeObjectState (ad esempio Added o Modified).
È necessario gestire manualmente la concorrenza e la convalida.
Per ulteriori informazioni, vedere gli articoli seguenti relativi alla sviluppo per applicazioni a più livelli:
Modelli di applicazioni a più livelli
Entità con rilevamento automatico
In un'applicazione Entity Framework il rilevamento delle modifiche negli oggetti viene controllato da un contesto dell'oggetto. Tuttavia, quando occorre modificare oggetti in un altro livello in cui tale contesto non è disponibile, è necessario decidere come tenere traccia delle modifiche e come segnalare nuovamente quelle modifiche al contesto dell'oggetto. A partire da .NET Framework versione 4, le entità con rilevamento automatico consentono di tenere traccia delle modifiche in qualsiasi livello. Un'entità con rilevamento automatico è un'entità compilata da un modello del toolkit di trasformazione dei modelli di testo (T4) che consente di generare tipi di entità in grado di registrare modifiche alle proprietà scalari, complesse e di navigazione. Per ulteriori informazioni, vedere Utilizzo delle entità con rilevamento automatico.
Per tenere traccia delle modifiche su un livello in cui gli oggetti non sono associati a un contesto dell'oggetto senza utilizzare entità con rilevamento automatico, è possibile utilizzare i metodi descritti nella sezione seguente per aggiornare il contesto allo scopo di salvare in modo permanente le modifiche rilevanti nel database.
Utilizzo di API per lo sviluppo di applicazioni a più livelli
I metodi seguenti consentono di aggiungere un intero grafico di oggetti e quindi utilizzarlo, applicare i valori appropriati alle proprietà dell'oggetto e impostare lo stato corretto su oggetti entità e relazioni.
Per aggiungere e associare entità, utilizzare i metodi seguenti:
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 |
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. |
Per modificare i valori scalari, utilizzare i metodi seguenti:
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. |
Imposta le singole proprietà sullo stato Modified. Utilizzare questa proprietà quando si conoscono le proprietà modificate anziché impostare l'intera entità da modificare. |
|
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. |
|
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. |
Per modificare lo stato delle entità e delle relazioni, utilizzare i 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. |
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, Definizione e gestione delle relazioni (Entity Framework). È possibile utilizzare anche il metodo ChangeState 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. |
Per salvare le modifiche nell'origine dati, utilizzare i metodi seguenti:
Membro | Descrizione |
---|---|
Memorizza in modo permanente tutte le modifiche all'origine dati. |
Utilizzare l'evento ObjectMaterialized se si desidera ottenere o impostare informazioni oppure sottoscrivere alcuni eventi durante la materializzazione dell'oggetto.
Membro | Descrizione |
---|---|
ObjectMaterialized |
Si verifica quando un nuovo oggetto entità viene creato dai dati nell'origine dati come parte di una query o di un'operazione di caricamento. L'evento viene generato dopo che sono caricati oggetti di riferimento, ma prima che siano caricate le raccolte. Se nel contesto è presente un oggetto con lo stesso valore di chiave, in Entity Framework non verrà ricreato l'oggetto e questo evento non sarà generato. |