Sto pensando di iniziare un nuovo progetto utilizzando EF 4 e passando attraverso alcuni articoli il lavoro, ho trovato un articolo su EF con il modello repository e unità di lavoro (http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)entità unità quadro + repository + o domanda
Guardando quell'articolo, usa ObjectContext come UnitOfWork e lo passa al Repository.
La mia domanda è cosa succede se ho 2 ObjectContext, il che significa che avrò 2 unità di lavoro, ma in realtà voglio che tutte le operazioni eseguite in quei 2 contesti siano un'unica unità di lavoro, è possibile questo scenario? Non voglio chiamare save su ogni contesto, mi piacerebbe che fosse transazionale .... senza usare transactioncope ...
Ad esempio, ho un contesto che gestisce il log delle operazioni e un altro contesto che gestisce Ordini. Diciamo che nel mio livello aziendale, ho un metodo chiamato AddOrder(). AddOrder() utilizzerà il contesto dell'ordine per creare un nuovo ordine, ma utilizzerà anche il contesto del registro delle operazioni per creare una nuova voce del registro delle operazioni. Dal momento che quelli sono in 2 contesto, dovrò chiamare save su entrambi i contesti per commettere .... forse l'unica opzione è avere un solo contesto ....
EDIT: Intendevo 2 contesti di tipi diversi ad esempio: OperationalLogContext e OrderContext.
Grazie, questo aiuta molto. Quindi l'unico modo è avere un solo contesto ... e se ho 2 contesti, non avrò altra scelta che ricorrere a qualche meccanismo di transazione, è corretto? – pdiddy
no. puoi avere quante ne vuoi. nota come, con la dipendenza da iniezione, ho detto HttpScopeOrThreadScope? Puoi cambiarlo per essere singleton (cattiva idea) o il default che è 'new' su una nuova istanza ogni volta che viene richiesto un oggetto.Quindi spetta a te :) Se stai facendo il 2o modo (che ho fatto usando un esempio di Test), allora sì ... dovresti manualmente rinnovare ogni contesto, uno per uno. ad esempio 'var context1 = new SSC (..); var context 2 = new SSC (...); _or = new OR (context1); _olr = nuovo OLR (context2); 'ecc. –
Ho dovuto aggiornare la mia risposta - Ho avuto un bug grave in esso. Ho sostituito ogni riferimento a una 'nuova EntityConnection (connectionString)' con una semplice 'connectionString' perché la connessione non veniva eliminata, se il contesto non creava' EntityConection' (invece di averne una passata). Saluti a Ayende Rahien (da Hibernating Rhino's) per la correzione. –