Un fondamentale componente di Entity Framework è Object Services, il cui fine è di eseguire query sui dati come oggetti e di aggiornare, inserire ed eliminare i dati, espressi come oggetti CLR fortemente tipizzati. Supporta query LINQ e query Entity SQL, sui tipi dati definiti nel modello concettuale. Inoltre fornisce le funzionalità per rilevare le modifiche, per gestire la concorrenza e per associare gli oggetti ai controlli. Le principali funzionalità di Object Services sono:
-
Esecuzione di query sul modello concettuale, al fine di restituire i dati come oggetti Determinazione della struttura dei risultati delle query. Infatti, se sono presenti relazioni tra gli oggetti è possibile specificare nella query di restituire anche gli oggetti correlati
-
Aggiunta, modifica ed eliminazione di oggetti, nel contesto dell’oggetto. Ad esempio, quando viene invocato il metodo SaveChanges(), vengono generati e avviati, sull'origine dati, i comandi necessari per eseguire le istruzioni INSERT, UPDATE o DELETE. Per impostazione predefinita, Entity Framework implementa il modello di concorrenza ottimistica.
-
Associazione degli oggetti ai controlli che supportano l’associazione dati (ad esempio, DataGridView, ComboBox, ListView, ecc.)
-
Connessione degli oggetti esistenti, direttamente al contesto dell’oggetto. Quando viene eseguita una query in un contesto dell'oggetto, gli oggetti restituiti vengono automaticamente connessi al contesto dell'oggetto
-
Disconnessione degli oggetti. E’ possibile disconnettere gli oggetti, al fine di risparmiare risorse, in quanto l'esecuzione di query ripetute nello stesso contesto dell'oggetto, determinano l'aumento delle risorse
-
Utilizzazione di Identity. In Object Services vengono utilizzati i valori Identity per rilevare le modifiche agli oggetti, gestire i conflitti e stabilire quando recuperare i dati dall'origine dati.
-
Gestione delle connessioni. Per impostazione predefinita, la connessione al database viene gestita da Entity Framework. Tuttavia è possibile gestire manualmente sia le connessioni che le transazioni. Entity Framework apre connessioni solo quando è necessario, per eseguire ad esempio, una query o chiamare SaveChanges() e chiude la connessione quando l'operazione è stata completa.
-
Gestione delle transazioni, sono supportate in Object Services per coordinare le operazioni nell'origine dati e per l'inserimento nelle transazioni distribuite.
-
Entity Framework consente di utilizzare classi dati personalizzate, insieme al modello dati, senza effettuare modifica alle classi di dati. Infatti è possibile utilizzare oggetti POCO (Plain-Old CLR Object) con il modello dati. Queste classi, note anche come oggetti che non riconoscono la persistenza, mappate a entità definite nel modello di dati, supportano la maggior parte dei comportamenti di query, inserimento, aggiornamento ed eliminazione dei tipi di entità generati dagli strumenti del Modello dati entità.
Gestione della concorrenza
Per impostazione predefinita, Entity Framework implementa un modello di concorrenza ottimistica. Ciò significa che non vengono mantenuti blocchi sui dati, nell'origine dati, tra il momento in cui viene eseguita la query sui dati e il relativo aggiornamento. Se esiste un alto livello di concorrenza, è opportuno definire una proprietà a livello concettuale con l’attributo ConcurrencyMode="fixed", come indicato nell’esempio che segue:
<property name="Status" type="Byte" nullable="false" concurrencymode="Fixed">
</property>
in questi casi Entity Framework, prima di salvare le modifiche nel database, verifica se esiste un conflitto fra i valori. Se esiste un conflitto Entity Framework genera l’evento OptimisticConcurrencyException.
try {
context.SaveChanges();
. . . .
}
catch (OptimisticConcurrencyException) {
// Risolvere il conflitto mediante il refresh dell’object context,
// prima di salvare le variazioni.
context.Refresh(RefreshMode.ClientWins, . . .);
context.SaveChanges();
}