Uso di DbContext

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 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 per, aggiungere (usando o Attach metodi ) o rimuovere (usando Add 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 solo l'accesso a una proprietà non eseguirà la query. Una query viene eseguita quando:

  • Enumerata da un'istruzione foreach (C#) o For Each (Visual Basic).
  • Viene enumerato da un'operazione di raccolta, ToArrayad esempio , ToDictionaryo ToList.
  • Gli operatori LINQ, First ad esempio o Any , vengono specificati nella parte più esterna della query.
  • Uno dei metodi seguenti viene chiamato: il Load metodo di estensione, DbEntityEntry.Reload, Database.ExecuteSqlCommande DbSet<T>.Find, se un'entità con la chiave specificata non viene già caricata nel contesto.

Durata

La durata del contesto inizia quando l'istanza viene creata e termina quando l'istanza viene eliminata o sottoposta a Garbage Collection. Usare se si desidera eliminare tutte le risorse che il contesto controlla alla fine del blocco. Quando si usa , il compilatore crea automaticamente un blocco try/finally e chiama 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 ogni 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 inserimento delle dipendenze, in genere è responsabilità del contenitore eliminare 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 quanto segue:
    • Quando si caricano più oggetti e i relativi riferimenti in memoria, l'utilizzo della memoria del contesto può aumentare rapidamente. È possibile pertanto che si verifichino 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 possibilità che si verifichino problemi correlati alla concorrenza aumentano quando l'intervallo tra il momento in cui viene eseguita una query sui dati e quello in cui i dati vengono aggiornati aumenta.

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.

In alcuni casi, tuttavia, può essere necessario disporre di maggiore controllo sull'apertura e la chiusura della connessione. 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 manualmente questo processo tramite la proprietà Connection.