2011-11-21 14 views
5

Ho provato diversi modi per far funzionare una semplice serie di transazioni per una semplice situazione client/server WCF. Il mio server WCF ha una dichiarazione a livello di classe della classe Entity Framework per l'accesso al mio database e diversi metodi per modificare i dati e un metodo per SaveChanges. Sto usando Oracle Data Access (ODP.NET).Come posso far funzionare Entity Framework e WCF con le transazioni? Ok ... qual è il segreto?

Ad esempio, desidero chiamare una modifica dal client e quindi una chiamata separata per salvare le modifiche nel servizio WCF. Non funziona. In pratica, tutto viene eseguito correttamente, ma quando viene eseguita la seconda chiamata per salvare le modifiche, il servizio WCF non ha più il contesto originale e pertanto non vengono salvate modifiche (e, di conseguenza, la precedente chiamata che ha effettuato il rollback delle modifiche) .

Sto utilizzando lo scope Transaction attorno a entrambe le operazioni nel mio client ed eseguendo Complete() dopo aver terminato. I miei servizi WCF dispongono di OperationContract che utilizzano [TransactionFlow(TransactionFlowOption.Mandatory)] e tali implementazioni del metodo utilizzano [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]. Infine, la mia configurazione Web è configurata con wsHttpBinding che ha la proprietà transactionFlow impostata su True.

Non ho fortuna. Qualunque cosa provi, quando provo a colpire il servizio per il salvataggio successivo, il contesto EF è già stato rinnovato.

+0

Non tutte le associazioni supportano le transazioni. http://www.wrox.com/WileyCDA/Section/Transactions-in-WCF-and-NET.id-305253.html – faester

+0

Come stai gestendo la sessione tra le chiamate? WCF è senza stato per impostazione predefinita, quindi a meno che non si stia dirigendo WCF a fare qualcosa con lo stato, si potrebbe perdere qualcosa. –

+0

Sono entità generate da edmx o poco generate – Praneeth

risposta

4

Questo non ha nulla a che fare con la transazione. La transazione funziona su una risorsa transazionale ma senza chiamare SaveChanges nella prima richiesta non c'era alcuna risorsa transazionale attiva perché il contesto EF non fa parte della transazione - il database è e il database è interessato solo quando si chiama SaveChanges. Per fare questo lavoro non hai bisogno di transazioni distribuite. È necessario un servizio di sessione completo e memorizzare il contesto EF nell'istanza del servizio. Un client utilizza la stessa istanza proxy client per comunicare con il servizio per tutte le richieste che la comunicazione sarà gestita dalla stessa istanza di servizio = stessa istanza di contesto EF che ricorderà le modifiche da chiamate precedenti.

IMHO questa è una pessima architettura. Semplicemente non usarlo. Esporre i metodi specializzati sul servizio WCF che eseguiranno modifiche e li salveranno. Se è necessario eseguire questi metodi nella transazione con altre risorse transazionali utilizzare la transazione reale distribuita.

+0

Rispetto la tua risposta. E temevo che sarebbe stata la risposta. Bummer. Sfortunatamente, diminuisce l'uso del mio servizio. Ad esempio, se voglio consentire agli utenti del mio servizio di creare ordini e/o creare/modificare elementi estranei a tali ordini (come i dettagli del prodotto) e consentire loro di legarsi in una singola transazione se si eseguono entrambe le azioni, può Si può fare in modo atomico (a più passaggi). Questo fa schifo ma capisco quello che stai dicendo. Grazie per la tua risposta. – Prethen

1

questo potrebbe essere un motivo. Dal momento che stai facendo un aggiornamento nel diverso contesto. il contesto non sa che l'oggetto è aggiornato per dire il contesto in cui l'oggetto è stato modificato e quindi si chiama savechnages(). Vedi se aiuta

+0

Sei corretto. Fondamentalmente, questo è ciò che il precedente rispondente ha notato. È un peccato non poterlo fare senza rendere il contesto e il servizio stateful. – Prethen

Problemi correlati