Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per usare Entity Framework per eseguire query, inserire, aggiornare ed eliminare dati usando oggetti .NET, è prima necessario creare un modello che esegue il mapping delle entità e delle relazioni definite nel modello alle tabelle di un database.
Dopo aver creato un modello, la classe primaria con cui l'applicazione interagisce è System.Data.Entity.DbContext (spesso definita classe di contesto). È possibile usare un oggetto DbContext associato a un modello per:
- Scrivere ed eseguire query
- Materializzare i risultati della query come oggetti di entità
- Tenere traccia delle modifiche apportate a tali oggetti
- Rendere persistenti le modifiche all'oggetto nel database
- Associare oggetti in memoria ai controlli dell'interfaccia utente
Questa pagina fornisce alcune indicazioni su come gestire la classe di contesto.
Definizione di una classe derivata DbContext
Il modo consigliato per lavorare con il contesto consiste nel definire una classe che deriva da DbContext ed espone le proprietà DbSet che rappresentano raccolte delle entità specificate nel contesto. Se si usa Entity Framework Designer, il contesto verrà generato automaticamente. Se si usa Code First, in genere si scriverà il contesto manualmente.
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
Dopo aver creato un contesto, è necessario eseguire una query, aggiungere (usando i metodi Add o Attach) o rimuovere (usando Remove) entità nel contesto tramite queste proprietà. L'accesso a una DbSet proprietà in un oggetto contesto rappresenta una query iniziale che restituisce tutte le entità del tipo specificato. Si noti che il solo accesso a una proprietà non eseguirà la query. Una query viene eseguita quando:
- Viene enumerato da un'istruzione
foreach(C#) oFor Each(Visual Basic). - Viene enumerato da un'operazione di raccolta,
ToArrayad esempio,ToDictionaryoToList. - Gli operatori LINQ,
Firstad esempio oAny, vengono specificati nella parte più esterna della query. - Uno dei seguenti metodi è chiamato: il metodo di estensione
Load,DbEntityEntry.Reload,Database.ExecuteSqlCommand, eDbSet<T>.Find, se un'entità con la chiave specificata non viene già caricata nel contesto.
Durata della vita
La durata del contesto inizia quando l'istanza viene creata e termina quando l'istanza viene eliminata o sottoposta a Garbage Collection. Usa using se desideri che tutte le risorse controllate dal contesto vengano rilasciate alla fine del blocco. Quando si utilizza using, il compilatore crea automaticamente un blocco try/finally e invoca dispose nel blocco finally.
public void UseProducts()
{
using (var context = new ProductContext())
{
// Perform data access using the context
}
}
Ecco alcune linee guida generali per decidere la durata del contesto:
- Quando si usano applicazioni Web, usare un'istanza di contesto per ogni richiesta.
- Quando si usa Windows Presentation Foundation (WPF) o Windows Form, usare un'istanza di contesto per modulo. In questo modo è possibile usare la funzionalità di rilevamento delle modifiche fornita dal contesto.
- Se l'istanza di contesto viene creata da un contenitore di iniezione delle dipendenze, in genere è responsabilità del contenitore gestire il contesto.
- Se il contesto viene creato nel codice dell'applicazione, ricordarsi di eliminare il contesto quando non è più necessario.
- Quando si lavora con un contesto a esecuzione prolungata, considerare i seguenti punti:
- Quando si caricano più oggetti e i relativi riferimenti in memoria, l'utilizzo della memoria del contesto può aumentare rapidamente. Ciò può causare problemi di prestazioni.
- Il contesto non è thread-safe, pertanto non deve essere condiviso tra più thread che eseguono operazioni simultanee.
- Se un'eccezione fa sì che il contesto si trova in uno stato irreversibile, l'intera applicazione può terminare.
- Le probabilità di problemi correlati alla concorrenza aumentano con l'aumentare del divario tra il momento in cui i dati vengono interrogati e aggiornati.
Connessioni
Per impostazione predefinita, il contesto gestisce le connessioni al database. Il contesto apre e chiude le connessioni in base alle esigenze. Ad esempio, il contesto apre una connessione per eseguire una query e quindi chiude la connessione quando tutti i set di risultati sono stati elaborati.
Ci sono casi in cui si vuole avere un maggiore controllo su quando la connessione si apre e si chiude. Ad esempio, quando si usa SQL Server Compact, è spesso consigliabile mantenere una connessione aperta separata al database per la durata dell'applicazione per migliorare le prestazioni. È possibile gestire questo processo manualmente usando la Connection proprietà .