Utilizzo di entità POCO (Entity Framework)

Entity Framework consente di utilizzare classi di dati personalizzate insieme al modello di dati senza apportare alcuna modifica alle classi di dati stesse. Pertanto è possibile pertanto utilizzare oggetti POCO (Plain-Old CLR Object), ad esempio gli oggetti di dominio esistenti, con il modello di dati. Queste classi di dati POCO, note anche come oggetti che non riconoscono la persistenza, mappate a entità definite in un modello di dati, supportano la maggior parte degli stessi comportamenti di query, inserimento, aggiornamento ed eliminazione dei tipi di entità generati dagli strumenti di Entity Data Model .

Requisiti di mapping

Per utilizzare le entità POCO con un modello di dati, il nome del tipo di entità deve corrispondere alla classe di dati personalizzata e di ogni proprietà del tipo di entità deve essere eseguito il mapping a una proprietà pubblica della classe di dati personalizzata. I nomi dei tipi e ognuna delle proprietà mappate devono essere equivalenti. Per informazioni sulla modifica di entità in un modello concettuale, vedere How to: Create and Modify Entity Types.

Dd456853.note(it-it,VS.100).gifNota:
Il mapping di entità POCO non è supportato se si applicano attributi di mapping a classi di dati personalizzate, incluso l'oggetto EdmSchemaAttribute a livello di assembly.

È possibile utilizzare il modello POCO per generare tipi di entità che non riconoscono la persistenza da un modello concettuale. Il modello non è incluso in Visual Studio ma può essere scaricato dalla Raccolta Visual Studio.

Creazione di oggetti proxy

Se si desidera che in Entity Framework vengano rilevate le modifiche apportate alle classi POCO e che sia supportato il caricamento lazy degli oggetti correlati, le classi POCO devono soddisfare i requisiti descritti nell'argomento Requisiti per la creazione di proxy POCO (Entity Framework).

Se per le entità POCO è abilitata la creazione di oggetti proxy, le modifiche apportate al grafico e ai valori delle proprietà degli oggetti vengono rilevate automaticamente da Entity Framework non appena si verificano. Per informazioni sulle opzioni di rilevamento delle modifiche con e senza proxy, vedere Rilevamento delle modifiche nelle entità POCO (Entity Framework).

È possibile avere una combinazione di entità POCO e di oggetti entità proxy. Per disabilitare la creazione di oggetti proxy, impostare il valore della proprietà ProxyCreationEnabled su false nell'istanza dell'oggetto ObjectContextOptions restituito dalla proprietà ContextOptions dell'oggetto ObjectContext:

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

Per ulteriori informazioni, vedere Procedura: creare un'entità POCO con proxy (Entity Framework).

Serializzazione di proxy POCO

In Windows Communication Foundation (WCF) non è possibile serializzare o deserializzare direttamente i proxy perché l'oggetto DataContractSerializer consente solo di serializzare e deserializzare i tipi noti e i tipi proxy non sono tipi noti. Se è necessario serializzare entità POCO, disabilitare la creazione di proxy o utilizzare la classe ProxyDataContractResolver per serializzare oggetti proxy come entità POCO originali. Per disabilitare la creazione di proxy, impostare la proprietà ProxyCreationEnabled su false.

La classe ProxyDataContractResolver consente di eseguire il mapping dei tipi proxy ai tipi POCO durante la serializzazione. Per indicare all'oggetto DataContractSerializer di utilizzare la classe ProxyDataContractResolver nelle operazioni del servizio, definire una classe Attribute (che sarà applicata alle operazioni del servizio) in cui, internamente, viene utilizzato l'oggetto ProxyDataContractResolver per il mapping dei tipi proxy ai tipi POCO puri. Associare questa classe Attribute ai metodi che fanno parte di un contratto di servizio nell'applicazione WCF.

Il client riceverà e deserializzerà le entità POCO effettive. Queste classi non disporranno delle funzionalità di caricamento lazy e di rilevamento delle modifiche degli oggetti proxy. Per rilevare le modifiche in queste entità attraverso i livelli, utilizzare le entità con rilevamento automatico. Queste ultime sono entità POCO che non dipendono da Entity Framework e dispongono della propria logica di rilevamento delle modifiche. Per ulteriori informazioni, vedere Procedura dettagliata: serializzazione di entità con rilevamento automatico (Entity Framework).

Per ulteriori informazioni, vedere Procedura dettagliata: serializzare proxy POCO con WCF (Entity Framework).

Gli oggetti proxy possono essere serializzati e deserializzati con la serializzazione binaria. Tuttavia, quando si serializza un oggetto grafico fra i limiti dell'oggetto AppDomain, è necessario assicurarsi che le definizioni dei tipi proxy siano presenti nell'ambiente di destinazione. Se i tipi non sono disponibili, la deserializzazione avrà esito negativo. Per assicurarsi che il tipo sia disponibile, utilizzare il metodo CreateProxyTypes.

Dd456853.note(it-it,VS.100).gifNota:
Anche se viene creato un oggetto di un tipo proxy, non dispone delle funzionalità di caricamento lazy e di rilevamento delle modifiche di un proxy.

Con la serializzazione binaria e di contratto dati, gli oggetti correlati vengono serializzati insieme all'oggetto primario. 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. Se non si disabilita la generazione del tipo proxy, che disabiliterebbe il caricamento lazy, disabilitare quest'ultimo in modo esplicito come illustrato nell'esempio seguente.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

Per ulteriori informazioni, vedere Serializzazione di oggetti (Entity Framework).

Riepilogo delle API specifiche dei proxy

Le API seguenti riguardano l'utilizzo di proxy POCO:

Membro Descrizione

CreateObject

Crea un nuovo oggetto proxy POCO, se la classe POCO soddisfa i requisiti descritti nell'argomento Requisiti per la creazione di proxy POCO (Entity Framework) e se ProxyCreationEnabled è impostato su true. In caso contrario, crea un oggetto di tipo di argomento generico. L'argomento generico di questo metodo può essere un qualsiasi tipo di riferimento concreto (le classi astratte, le interfacce e i tipi di valori non sono supportati). Se il tipo generico è un tipo CLR che non è mappato al modello concettuale o un tipo che non soddisfa i requisiti per la creazione di proxy, il metodo tenterà di utilizzare qualsiasi costruttore senza parametri del tipo passato per creare e restituire una nuova istanza del tipo. Oltre al metodo CreateObject nell'oggetto ObjectContext è possibile utilizzare i metodi CreateObject e CreateObject nell'oggetto ObjectSet. Per ulteriori informazioni, vedere Procedura: creare un'entità POCO con proxy (Entity Framework).

Questo metodo non consente di aggiungere l'oggetto creato al contesto dell'oggetto. A tal fine è necessario utilizzare i metodi descritti nell'argomento Creazione, aggiunta, modifica ed eliminazione di oggetti (Entity Framework).

ProxyCreationEnabled

Con questo flag impostato su true, tramite Entity Framework si tenterà di creare proxy per le entità POCO. Per impostazione predefinita, il flag ProxyCreationEnabled è impostato su true.

GetObjectType

System.Data.Objects.ObjectContext.GetObjectType(System.Type) è un metodo statico che restituisce il tipo POCO da cui deriva il proxy specificato se un tipo proxy è stato passato come argomento. Se è stato passato un tipo non proxy, questo metodo restituisce lo stesso tipo.

CreateProxyTypes

Crea un set di tipi proxy per i tipi POCO specificati in base ai metadati caricati nell'oggetto ObjectContext. Questo metodo non crea un'istanza di oggetti di tipi proxy creati. Ad esempio, il codice seguente consentirà di creare proxy per le classi POCO Customer e Order: context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

Quando si caricano oggetti dall'origine dati o si creano nuovi oggetti con il metodo CreateObject, in Entity Framework vengono creati tipi proxy per le classi POCO durante il runtime. Tuttavia, si potrebbero presentare delle condizioni che richiedono la creazione anticipata di tipi proxy. Quando, ad esempio, si serializza un oggetto grafico entro i limiti dell'oggetto AppDomain, è necessario assicurarsi che i tipi proxy siano effettivamente presenti nell'ambiente di destinazione. Se i tipi non sono disponibili, la deserializzazione avrà esito negativo.

GetKnownProxyTypes

GetKnownProxyTypes è un metodo statico che restituisce un'enumerazione contenente tutti i tipi proxy creati finora nell'oggetto AppDomain. Negli scenari di serializzazione il metodo può essere utilizzato per ottenere tutti i tipi che dovrebbero già essere inclusi nell'ambiente di destinazione e che dovrebbero essere riconosciuti dal serializzatore.

In questa sezione

Requisiti per la creazione di proxy POCO (Entity Framework)

Caricamento di entità POCO correlate (Entity Framework)

Rilevamento delle modifiche nelle entità POCO (Entity Framework)

Procedura: definire entità POCO (Entity Framework)

Procedura: definire un contesto dell'oggetto personalizzato (Entity Framework)

Procedura: personalizzare i file di mapping e di modellazione per l'utilizzo con oggetti personalizzati (Entity Framework)

Procedura: definire un contesto dell'oggetto personalizzato (Entity Framework)

Procedura: creare un'entità POCO con proxy (Entity Framework)

Procedura: caricare in modo esplicito entità POCO (Entity Framework)

Procedura: rilevare modifiche nelle entità POCO

Procedura: modificare le relazioni tra le entità POCO (Entity Framework)

Di seguito è riportata la serie di post di blog su POCO disponibili in ADO.NET.

POCO

POCO in Entity Framework 4 - Parte 2

POCO in Entity Framework 4 - Parte 3

Vedere anche

Concetti

Personalizzazione di oggetti (Entity Framework)
Definizione e gestione delle relazioni (Entity Framework)