Gestione di connessioni e transazioni (Entity Framework)

Per impostazione predefinita, la connessione al database viene gestita da Entity Framework . È tuttavia possibile gestire manualmente sia connessioni che transazioni nell'applicazione Entity Framework .

Connessioni ed Entity Framework

Entity Framework apre connessioni solo quando necessario, ad esempio per eseguire una query o chiamare SaveChanges e chiude quindi la connessione quando l'operazione è completa.

Se si chiama uno dei metodi seguenti viene aperta la connessione:

Bb896325.note(it-it,VS.100).gifNota:
Quando viene chiamato un metodo di query, la connessione viene aperta e rimane aperta fino a quando l'oggetto ObjectResult non è stato completamente utilizzato o eliminato.

Gestione manuale di connessioni

Entity Framework espone l'oggetto EntityConnection tramite la proprietà Connection. Questo consente di gestire la connessione e le transazioni o di fornire un oggetto EntityConnection personalizzato. Ciò è utile quando si desidera mantenere aperta una connessione all'interno di un contesto dell'oggetto di breve durata per migliorare le prestazioni o per controllare in modo esplicito le transazioni. La stessa connessione al provider utilizzata da Entity Framework può essere condivisa con altre parti di un'applicazione. Nell'esempio seguente viene illustrato come aprire in modo esplicito una connessione.

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.Connection.Open();

Per ulteriori informazioni, vedere Procedura: aprire manualmente la connessione dal contesto dell'oggetto (Entity Framework).

Quando si apre manualmente la connessione in un contesto dell'oggetto con esecuzione prolungata, è necessario chiamare il metodo Dispose per assicurarsi che la connessione venga chiusa quando il contesto non è più necessario. È anche possibile chiamare il metodo Close su EntityConnection per chiudere in modo esplicito la connessione. Per ulteriori informazioni, vedere Procedura: gestire la connessione in un contesto dell'oggetto con esecuzione prolungata (Entity Framework).

È inoltre possibile creare un oggetto EntityConnection e fornire questa connessione al contesto dell'oggetto. In questo caso, è possibile aprire la connessione manualmente o consentire al contesto dell'oggetto di aprirla quando necessario. Quando si fornisce l'oggetto EntityConnection al contesto dell'oggetto, è necessario assicurarsi che sia il contesto che l'oggetto EntityConnection vengano eliminati quando non sono più necessari. Nell'esempio seguente viene creata una connessione, che viene passata al contesto dell'oggetto:

' Create an EntityConnection. 
Dim conn As New EntityConnection("name=AdventureWorksEntities")

' Create a long-running context with the connection. 
Dim context As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities");

// Create a long-running context with the connection.
AdventureWorksEntities context =
    new AdventureWorksEntities(conn);

Per ulteriori informazioni, vedere Procedura: utilizzare EntityConnection con un contesto dell'oggetto (Entity Framework).

Considerazioni per la gestione di connessioni

Le considerazioni seguenti riguardano la gestione delle connessioni:

  • La connessione viene aperta dal contesto dell'oggetto, se non è già aperta prima di un'operazione. Se la connessione viene aperta dal contesto dell'oggetto durante un'operazione, viene sempre chiusa dopo il completamento dell'operazione.

  • Se si apre manualmente la connessione, questa non viene chiusa dal contesto dell'oggetto. Chiamando Close o Dispose la connessione viene chiusa.

  • Se la connessione viene creata dal contesto dell'oggetto, quando il contesto viene eliminato la connessione viene sempre eliminata.

  • In un contesto dell'oggetto con esecuzione prolungata, è necessario assicurarsi che il contesto venga eliminato quando non è più necessario.

Se si fornisce un oggetto EntityConnection aperto per il contesto dell'oggetto, è necessario assicurarsi che venga eliminato.

Transazioni ed Entity Framework

Entity Framework supporta l'inserimento automatico delle transazioni. Questo significa che le attività eseguite in un contesto dell'oggetto, ad esempio l'esecuzione di query e il salvataggio delle modifiche ai dati nell'origine dati, possono essere isolate nell'origine dati eseguendo l'operazione in una transazione System.Transactions. Le transazioni sono utilizzate in Entity Framework per eseguire le azioni seguenti:

  • Eseguire più operazioni nell'origine dati che devono essere estremamente coerenti, ad esempio query che dipendono dal corretto completamento delle modifiche dell'oggetto.

  • Coordinare le modifiche nel contesto dell'oggetto con le altre operazioni distribuite, ad esempio l'invio di un messaggio di posta elettronica di notifica o la scrittura in una coda di messaggi.

Le transazioni che richiedono l'inserimento di gestori di risorse aggiuntivi vengono chiamate transazioni distribuite. Le transazioni distribuite utilizzano uno strumento DTC (Distributed Transaction Coordinator) per gestire le risorse necessarie per completare la transazione. La promozione di una transazione a uno strumento DTC può essere un processo relativamente costoso da stabilire e completare. Alcuni gestori di risorse, come SQL Server 2005, supportano il protocollo delle transazioni PSPE (Promotable Single Phase Enlistment). Questo consente a un gestore di risorse di ospitare una transazione di cui è successivamente possibile eseguire l'escalation in modo che venga gestita da DTC (Distributed Transaction Coordinator), se necessario.

Per ulteriori informazioni su System.Transactions, vedere Transaction Processing. Per ulteriori informazioni sull'utilizzo di System.Transactions con SQL Server, vedere System.Transactions Integration with SQL Server (ADO.NET).

Considerazioni per la gestione di transazioni

Le considerazioni seguenti riguardano l'utilizzo delle transazioni con Entity Framework :

  • Vengono sottoposte a transazione solo le operazioni eseguite nell'origine dati. Le modifiche apportate agli oggetti nel contesto dell'oggetto non vengono sottoposte a transazione. Le modifiche agli oggetti nel contesto sono visibili all'esterno dell'ambito della transazione.

  • Quando si chiama SaveChanges, se è presente una transazione corrente, questa viene utilizzata da Entity Framework per le operazioni nell'origine dati. In caso contrario, viene creata una nuova transazione per l'operazione. È possibile definire le transazioni utilizzando EntityTransaction, Transaction o TransactionScope.

    Bb896325.note(it-it,VS.100).gifNota:
    Per l'inserimento in una transazione esistente, la connessione potrebbe venire chiusa e riaperta da Entity Framework .

  • Quando tramite Entity Framework viene creata una nuova transazione per un'operazione SaveChanges, le modifiche agli oggetti nel contesto dell'oggetto non vengono accettate fino a quando la transazione non viene completata. In questo modo, viene garantita la coerenza dello stato del contesto dell'oggetto e dell'origine dati.

  • È possibile che si verifichi una promozione di una transazione in un DTC quando una connessione viene chiusa e riaperta all'interno di una sola transazione. Poiché Entity Framework apre e chiude automaticamente la connessione, è consigliabile considerare l'ipotesi di aprire e chiudere manualmente la connessione per evitare la promozione della transazione. Per ulteriori informazioni, vedere Procedura: aprire manualmente la connessione dal contesto dell'oggetto (Entity Framework).

  • Quando si intende ritentare le operazioni in una transazione, è necessario verificare che lo stato degli oggetti nel contesto non venga reimpostato prima del completamento della transazione. A tale scopo, è necessario chiamare SaveChanges con un valore false per il parametro acceptChangesDuringSave, quindi chiamare AcceptAllChanges solo dopo il corretto completamento delle operazioni nella transazione. Per ulteriori informazioni, vedere Procedura: gestire transazioni in Entity Framework.

Durante l'esecuzione di un nuovo tentativo con le transazioni coordinate, è possibile chiamare SaveChanges una seconda volta senza prima chiamare AcceptAllChanges. In questo caso, in Entity Framework verrà eseguito un tentativo di riapplicare le stesse modifiche all'origine dati.

In questa sezione

Procedura: aprire manualmente la connessione dal contesto dell'oggetto (Entity Framework)

Procedura: gestire la connessione in un contesto dell'oggetto con esecuzione prolungata (Entity Framework)

Procedura: utilizzare EntityConnection con un contesto dell'oggetto (Entity Framework)

Procedura: gestire transazioni in Entity Framework