Entity Framework (SQL Server Compact)
Entity Framework è un set di tecnologie in ADO.NET che supporta lo sviluppo di applicazioni software orientate ai dati. Entity Framework consente agli sviluppatori di utilizzare dati in forma di oggetti e proprietà specifici del dominio, ad esempio clienti e indirizzi dei clienti, senza che sia necessario occuparsi delle tabelle e delle colonne di database sottostanti in cui vengono archiviati i dati.
Consentendo agli sviluppatori di utilizzare i dati a un livello di astrazione superiore, Entity Framework è in grado di supportare codice indipendente da qualsiasi motore di archiviazione dei dati o schema relazionale specifico. Gli sviluppatori possono creare applicazioni di accesso ai dati effettuando la programmazione per a un modello di applicazione concettuale anziché direttamente per uno schema di archiviazione relazionale.
Le applicazioni e i servizi Entity Framework sono costituiti da un modello concettuale e uno di archiviazione e dal mapping tra i modelli. Per soddisfare le esigenze degli sviluppatori che desiderano derivare un modello EDM (Entity Data Model) da un database esistente, in Entity Framework è disponibile un set di strumenti che generano e convalidano un modello EDM e creano classi programmabili in base al modello concettuale.
Tramite EDM, ADO.NET espone entità come oggetti nell'ambiente .NET rendendo il livello oggetti una destinazione ideale per il supporto Language Integrated Query (LINQ). LINQ to Entities consente agli sviluppatori di creare query flessibili fortemente tipizzate nel contesto dell'oggetto Entity Framework utilizzando espressioni LINQ e gli operatori di query standard LINQ direttamente dall'ambiente di sviluppo. Per ulteriori informazioni su Entity Framework e LINQ to Entities, vedere la documentazione di Entity Framework.
In SQL Server Compact è disponibile il supporto per Entity Framework per la piattaforma Applicazioni Web a partire da SQL Server Compact 4.0.
Entity Framework in SQL Server Compact
Per utilizzare Entity Framework con SQL Server Compact 4.0, è necessario innanzitutto installare Entity Framework. Entity Framework è un componente di .NET Framework 4.
Il supporto per lo sviluppo per SQL Server Compact 4.0 viene fornito da Visual Studio 2010 Service Pack 1, mentre il supporto di Entity Data Model Designer per Entity Framework in Visual Studio 2010 Service Pack 1 viene fornito da Entity Framework Tools. Si noti che a partire da Visual Studio 2008 Service Pack 1 (SP1), Entity Data Model Designer (Entity Designer) è un componente di Visual Studio. Tale componente costituisce uno strumento di visualizzazione che consente di creare e modificare un modello EDM. Per ulteriori informazioni su questo strumento, vedere la documentazione di Entity Framework.
Nella versione SQL Server Compact 4.0, in SQL Server Compact è disponibile l'assembly gestito System.Data.SQLServerCe.Entity.dll. L'assembly System.Data.SQLServerCe.Entity.dll viene utilizzato internamente dal provider di dati gestito ADO.NET System.Data.SqlServerCE.dll e supporta l'accesso ai dati descritto in un modello EDM.
Quando si installa SQL Server Compact 4.0 o versioni successive di SQL Server Compact (SSCERuntime-ENU.msi), System.Data.SQLServerCe.Entity.dll viene installato nella cartella %Programmi%\Microsoft SQL Server Compact Edition\v4.0.
Nota
È possibile utilizzare SQL Server Compact 4.0 solo con Entity Framework 4 in .NET Framework versione 4. SQL Server Compact 4.0 non supporta .NET Framework 3.5 e genera un errore.
Code-First/Code-Only
SQL Server Compact 4.0 supporta il modello di programmazione Code-First di ADO.NET Entity Framework 4. Sono disponibili due modalità per creare applicazioni Web Entity Framework: Database-First e Model-First. Model-First è una nuova caratteristica di ADO.NET Entity Framework 4 (.NET Framework 4) che consente di implementare un flusso di lavoro per lo sviluppo più centrato sul codice, noto come sviluppo Code-First/Code-Only. In questo flusso di lavoro, il CODE corrisponde a Model. Il modello di programmazione Code-First funziona nel seguente modo:
Per utilizzare la modalità Code-Only, è necessario creare alcune classi POCO (Plain Old CLR Object). Sono costituite principalmente da costruttori.
Successivamente, è necessario scrivere una classe che deriva dalla classe ObjectContext per descrivere la forma del modello e la modalità di accesso alle classi POCO desiderata. Si tratta di una classe specifica di Entity Framework.
A questa punto, si dispone di tutto ciò che serve per CLR, ma non è possibile utilizzare la classe ObjectContext senza metadati di Entity Framework, che sono memorizzati nel file EDMX. In modalità Code-Only non esiste un file EDMX.
Per utilizzare i metadati, è necessario definire la classe ContextBuilder, in cui si definiscono le analisi SqlConnection. ContextBuilder tramite le proprietà di ObjectContext. In questa classe vengono definiti per convenzione il modello concettuale, il modello di archiviazione e il mapping predefiniti. Successivamente, utilizza i metadati e la classe SqlConnection passati tramite la classe ContextBuilder per creare una EntityConnection.
Viene quindi creata un'istanza della classe ObjectContext passando la classe EntityConnection al costruttore, creato nelle classi POCO.
Una volta creata l'istanza del contesto, è possibile utilizzare numerosi metodi di estensione per eseguire le operazioni seguenti:
Creazione automatica di uno script del database.
Controllo dell'esistenza del percorso del database.
Creazione di un database.
Rilascio di un database, ecc.
Anziché utilizzare le convenzioni, è possibile ignorarle. In Entity Framework 4, viene effettuato il refactoring di ContextBuilder in ModelBuilder e DbModel.
Per eseguire il download, ADO.NET Entity Framework 4.
Limiti di SQL Server Compact
Di seguito vengono riportati alcuni limiti di SQL Server Compact quando viene utilizzato con Entity Framework:
Se utilizzato con Entity Framework, SQL Server Compact 4.0 supporta entità con chiavi o valori generati dal server solo quando il tipo di chiave è Colonne Identity.
In caso di utilizzo di Entity Framework, le chiavi dell'entità possono essere contrassegnate come generate dal server. In questo modo il database può generare un valore per la chiave al momento dell'inserimento o della creazione dell'entità. È inoltre possibile contrassegnare come valori generati dal server zero o più proprietà di un'entità. Per ulteriori informazioni, vedere l'argomento Modello generato dall'archivio nella documentazione di Entity Framework.
Entity Framework consente di definire tipi di entità con chiavi o valori generate dal server. L'operazione di manipolazione dei dati su un'entità per cui sono presenti valori generati dal server diversi dal tipo Identity genera un'eccezione "Azione non supportata".
Se nello schema di SQL Server Compact sono presenti nomi di vincoli duplicati, la generazione di Entity Data Model per SQL Server Compact 4.0 non riuscirà.
In SQL Server Compact i nomi dei vincoli sono univoci all'interno di una tabella consentendo pertanto nomi di vincoli duplicati nel database. Il comportamento è diverso da SQL Server, dove i nomi dei vincoli sono univoci all'interno del database. Se uno schema di SQL Server Compact 4.0 contiene nomi di vincoli di integrità referenziale duplicati (relazione chiave primaria - chiave esterna), la generazione di Entity Data Model mediante la procedura guidata Entity Data Model di ADO.NET Entity Framework non riuscirà. Il nome del vincolo duplicato deve essere sempre univoco all'interno del database, aggiungendo ad esempio il nome della tabella al nome del vincolo.
SQL Server Compact non supporta operatori full outer join che utilizzano Entity Framework, sebbene in Entity SQL tali operatori siano supportati. La query seguente, ad esempio, non è supportata:
Entity SQL:
SELECT c.Name, c.Id, o.Id FROM NW.Customers AS c FULL OUTER JOIN NW.Orders AS o ON c.Id = o.CustomerId
Si noti che SQL Server Compact supporta operatori inner join, left outer join e right outer join che utilizzano Entity Framework.
SQL Server Compact non supporta sottoclausole COLLATE nella clausola ORDER BY di una query Entity SQL.
Entity SQL consente di specificare una sottoclausola COLLATE come parte di ogni chiave in una clausola ORDER BY. La sottoclausola COLLATE è applicabile solo per espressioni con valori stringa e determina la semantica di confronto da utilizzare per l'espressione specifica.
Se utilizzato con Entity Framework, SQL Server Compact non supporta l'utilizzo di una sottoclausola COLLATE nella clausola ORDER BY di una query Entity SQL. La query seguente, ad esempio, non è supportata:
Entity SQL:
SELECT value c FROM NW.Customers AS c ORDER BY c.Name COLLATE Traditional_Spanish_ci_ai
A differenza di SQL Server, SQL Server Compact non supporta le operazioni modulo (indicate dal simbolo %) sui tipi di dati real, float, money e numeric.
In SQL Server Compact le query seguenti provocano un messaggio di errore:
Entity SQL:
( CAST ( 1 AS Edm.Int16) % CAST ( 1 AS Edm.Decimal) )
Transact-SQL:
SELECT cast (1 as smallint) %cast (1 as decimal(28,4))
Quando si esegue una query di questo tipo, verrà visualizzato il seguente messaggio di errore: "Modulo non supportato per i tipi di dati real, float, money e numeric. [ Data type = numeric ]".
SQL Server Compact non supporta DISTINCT nelle funzioni di aggregazione (max, min, sum, count).
Se si tenta di scrivere query Entity SQL e Transact-SQL che utilizzano DISTINCT in funzioni di aggregazione (max, min, sum, count), verrà generata un'eccezione "Not supported". Nell'esempio seguente viene illustrata una query Entity SQL che utilizza DISTINCT nella funzione di aggregazione count.
Entity SQL:
SELECT count(distinct [TaskId]) FROM ArubaContainer.TaskSet AS [Task]
Se utilizzato con Entity Framework, SQL Server Compact non supporta timeout di comando.
Entity Framework abilita timeout per comandi da specificare tramite la proprietà ObjectContext.QueryTimeout o la proprietà EntityCommand.CommandTimeout.
Se utilizzato con Entity Framework, SQL Server Compact non supporta timeout. Questo significa che il timeout di comando non deve essere impostato su un valore diverso da zero. Se viene impostata una proprietà relativa al timeout della connessione, nel database di SQL Server Compact viene generata un'eccezione NotSupportedException(“CommandTimeout”).
SQL Server Compact supporta solo stringhe Unicode.
Entity Framework supporta sia stringhe Unicode che non Unicode, mentre SQL Server Compact supporta solo stringhe Unicode. Il valore letterale <literal> di tipo "String" non è supportato dal provider corrente. Per le stringhe non Unicode, in SQL Server Compact viene generata l'eccezione "near constant literal".
SQL Server Compact non supporta stored procedure e viste.
Esempio
Per informazioni sulle modalità di creazione di applicazioni Entity Framework che utilizzano il database di SQL Server Compact come origine dati, vedere Creazione di un'applicazione Entity Framework (SQL Server Compact).