Provider di reflection (WCF Data Services)
Oltre a consentire l'esposizione di dati da un modello di dati tramite Entity Framework, WCF Data Services è in grado di esporre dati non definiti rigidamente in un modello basato su entità. Il provider di reflection espone i dati nelle classi che restituiscono i tipi che implementano l'interfaccia IQueryable. WCF Data Services utilizza la reflection per dedurre un modello di dati per queste classi e può convertire le query basate sull'indirizzo eseguite sulle risorse in query basate su LINQ (Language-Integrated Query) eseguite sui tipi IQueryable esposti.
Nota: |
---|
È possibile utilizzare il metodo AsQueryable per restituire un'interfaccia IQueryable da una classe che implementa l'interfaccia IEnumerable.In questo modo è possibile utilizzare la maggior parte dei tipi di raccolte generiche come origine dati per il servizio dati. |
Il provider di reflection supporta gerarchie di tipi. Per ulteriori informazioni, vedere Procedura: creare un servizio dati utilizzando il provider di reflection (WCF Data Services).
Deduzione del modello di dati
Quando si crea il servizio dati, il modello di dati viene dedotto dal provider tramite reflection. Nell'elenco seguente viene illustrata la modalità di reflection utilizzata dal provider per dedurre il modello di dati:
Contenitore di entità: classe che espone i dati come proprietà che restituiscono un'istanza di IQueryable. Quando si indirizza un modello di dati basato su reflection, il contenitore di entità rappresenta la radice del servizio. Per un determinato spazio dei nomi è supportata solo una classe contenitore di entità.
Set di entità: le proprietà che restituiscono istanze di IQueryable vengono gestite come set di entità. I set di entità possono essere indirizzati direttamente come risorse nella query. Solo una proprietà nel contenitore di entità può restituire un'istanza di IQueryable di un determinato tipo.
Tipi di entità: tipo T dell'oggetto IQueryable restituito dal set di entità. Le classi che fanno parte di una gerarchia di ereditarietà vengono tradotte dal provider di reflection in una gerarchia di tipi di entità equivalenti.
Chiavi di entità: ogni classe di dati che consiste in un tipo di entità deve disporre di una proprietà di chiave. Questa proprietà viene assegnata con l'attributo DataServiceKeyAttribute (
[DataServiceKeyAttribute]
).Nota: È opportuno applicare l'attributo DataServiceKeyAttribute solo a una proprietà che può essere utilizzata per identificare in modo univoco un'istanza del tipo di entità.Questo attributo viene ignorato se applicato a una proprietà di navigazione. Proprietà del tipo di entità: sono diverse dalle chiavi di entità, in quanto il provider di reflection gestisce le proprietà accessibili non relative a indicizzatori di una classe corrispondente a un tipo di entità nel modo seguente:
Se la proprietà restituisce un tipo primitivo, si presuppone che la proprietà sia una proprietà di un tipo di entità.
Se la proprietà restituisce un tipo che consiste anche in un tipo di entità, si presuppone che la proprietà sia una proprietà di navigazione che rappresenta il lato "uno" di una relazione molti-a-uno o uno-a-uno.
Se la proprietà restituisce un oggetto IEnumerable di un tipo di entità, si presuppone che la proprietà sia una proprietà di navigazione che rappresenta il lato "molti" di una relazione uno-a-molti o molti-a-molti.
Se il tipo restituito della proprietà è un tipo valore, significa che la proprietà rappresenta un tipo complesso.
Nota: |
---|
A differenza del modello di dati basato sul modello di entità relazionale, i modelli basati sul provider di reflection non sono i grado di interpretare dati relazionali.Per esporre dati relazionali tramite WCF Data Services , è necessario utilizzare Entity Framework. |
Mapping dei tipi di dati
Quando un modello di dati viene derivato da classi di .NET Framework, i tipi primitivi inclusi nel modello di dati vengono mappati ai tipi di dati di .NET Framework nel modo seguente:
Tipo di dati di .NET Framework | Tipo del modello di dati |
---|---|
Byte [] |
Edm.Binary |
Edm.Boolean |
|
Byte |
Edm.Byte |
Edm.DateTime |
|
Edm.Decimal |
|
Edm.Double |
|
Edm.Guid |
|
Edm.Int16 |
|
Edm.Int32 |
|
Edm.Int64 |
|
Edm.SByte |
|
Edm.Single |
|
Edm.String |
Nota: |
---|
I tipi di valore nullable di .NET Framework vengono mappati agli stessi tipi del modello di dati dei tipi di valore corrispondenti a cui non è possibile assegnare valori null. |
Abilitazione di aggiornamenti nel modello di dati
Per consentire aggiornamenti ai dati esposti tramite questo tipo di modello di dati, il provider di reflection definisce un'interfaccia IUpdatable. Questa interfaccia indica al servizio dati la modalità da utilizzare per rendere persistenti gli aggiornamenti ai tipi esposti. Per consentire aggiornamenti alle risorse definite dal modello di dati, la classe contenitore di entità deve implementare l'interfaccia IUpdatable. Per un esempio di implementazione dell'interfaccia IUpdatable, vedere Procedura: creare un servizio dati utilizzando un'origine dati LINQ to SQL (WCF Data Services).
Per fare in modo che gli aggiornamenti vengano propagati all'origine dati tramite il provider di reflection, l'interfaccia IUpdatable richiede l'implementazione dei membri seguenti:
Membro | Descrizione |
---|---|
Fornisce la funzionalità che consente di aggiungere un oggetto a una raccolta di oggetti correlati accessibili da una proprietà di navigazione. |
|
Fornisce la funzionalità che consente di annullare le modifiche in sospeso apportate ai dati. |
|
Fornisce la funzionalità che consente di creare una nuova risorsa nel contenitore specificato. |
|
Fornisce la funzionalità che consente di eliminare una risorsa. |
|
Fornisce la funzionalità che consente di recuperare una risorsa identificata da una query e un nome di tipo specifici. |
|
Fornisce la funzionalità che consente di restituire il valore di una proprietà di una risorsa. |
|
Fornisce la funzionalità che consente di rimuovere un oggetto da una raccolta di oggetti correlati accessibili da una proprietà di navigazione. |
|
Fornisce la funzionalità che consente di aggiornare una risorsa specificata. |
|
Fornisce la funzionalità che consente di restituire la risorsa rappresentata da un'istanza specifica dell'oggetto. |
|
Fornisce la funzionalità che consente di salvare tutte le modifiche in sospeso. |
|
Fornisce la funzionalità che consente di impostare un riferimento all'oggetto correlato tramite una proprietà di navigazione. |
|
Fornisce la funzionalità che consente di impostare il valore della proprietà di una risorsa. |
Gestione della concorrenza
WCF Data Services supporta un modello di concorrenza ottimistica consentendo la definizione di un token di concorrenza per un'entità. Questo token di concorrenza, che include una o più proprietà dell'entità, viene utilizzato dal servizio dati per determinare se si è verificata una modifica nei dati richiesti, aggiornati o eliminati. Quando i valori del token ottenuti dal valore eTag nella richiesta sono diversi da quelli correnti dell'entità, viene generata un'eccezione dal servizio dati. L'oggetto ETagAttribute viene applicato a un tipo di entità per definire un token di concorrenza nel provider di reflection. Il token di concorrenza non può includere una proprietà della chiave o una proprietà di navigazione. Per ulteriori informazioni, vedere Making Changes to Data (WCF Data Services).
Utilizzo di LINQ to SQL con il provider di reflection
Entity Framework è supportato a livello nativo per impostazione predefinita e rappresenta pertanto il provider di dati consigliato per l'utilizzo di dati relazionali con WCF Data Services . Per utilizzare classi LINQ to SQL con un servizio dati, è tuttavia possibile utilizzare il provider di reflection. I set di risultati Table restituiti dai metodi sull'oggetto DataContext generato da Progettazione relazionale oggetti di LINQ to SQL implementa l'interfaccia IQueryable. In questo modo il provider di reflection è in grado di accedere a questi metodi e di restituire i dati di entità da SQL Server tramite le classi LINQ to SQL generate. Poiché LINQ to SQL non implementa l'interfaccia IUpdatable, sarà tuttavia necessario aggiungere una classe parziale che estenda la classe parziale DataContext esistente per aggiungere l'implementazione di IUpdatable. Per ulteriori informazioni, vedere Procedura: creare un servizio dati utilizzando un'origine dati LINQ to SQL (WCF Data Services).