5

Ho un database abbastanza grande, circa 80 tabelle circa. Quindi ho deciso di separare le tabelle in un contesto limitato invece di avere tutte le 80 tabelle in 1 grande file edmx.Aggiungo la stessa tabella in contesto limitato con più entità. Contesto

contesti Così ho delimitate come vendite, clienti, ecc

ho il mio tavolo principale cliente all'interno di file di miei clienti EDMX. Tuttavia, ho anche bisogno di accedere a determinati campi, non tutti, ma 1 o 2 campi (ad esempio, ho solo bisogno del nome del cliente, invece dell'intero oggetto/tabella cliente) dalla tabella dei clienti dal contesto di vendita edmx.

Devo aggiungere l'intera tabella clienti nel file edmx di vendita? Qual è la migliore pratica per questo scenario?

risposta

5

ci sono un paio di questioni di fondo con questo approccio (IMO):

EF, come qualsiasi ORM, rientra nella preoccupazione persistenza. In quanto tale, non dovrebbe interferire con il modo in cui strutturate il vostro modello di dominio. Il fatto che tutte le entità siano persistite in ciò che sembra un archivio di persistenza può essere un'indicazione che i contesti limitati si sovrappongono o sono inesistenti.

Cercare di passare a una struttura migliore non è una cosa negativa :) --- tuttavia, come ha affermato Mark Oreta, probabilmente non mi preoccuperei della struttura EF.

Il problema principale che si sta verificando è causato dal tentativo di leggere dal modello di dominio. Questo sembra emergere troppo spesso nei sistemi e rende le cose piuttosto difficili. Il caricamento lento è il risultato diretto di esattamente questo. Quando leggi, dovresti idealmente usare un livello di query con accesso a un negozio di query (potrebbe essere lo stesso database) ottimizzato per la lettura. Nel tuo esempio hai bisogno di un nome cliente denormalizzato nel tuo dominio di vendita. Questo va bene. Cercando di ottenere ciò leggendo il tuo modello di dominio e poi cercando di inserire dati da un modello di dominio in un altro contesto limitato, ciò che ti sta causando il dolore.

Se si procede lungo il percorso di suddivisione dei dati, sarà necessario tenerlo diviso.

Sebbene i dati di vari BC possano essere tutti nello stesso negozio, è necessario considerare i dati come se ogni BC avesse il proprio database. A volte ho un singolo progetto con varie preoccupazioni (livelli per alcuni) in diverse cartelle/spazio dei nomi (.NET qui). Dovrebbe essere possibile suddividere queste preoccupazioni in assemblee separate per un capriccio. Quindi non dovrebbero essere troppo strettamente accoppiati. Lo stesso vale per questa struttura dati che stai tentando di dividere. Dovresti in sostanza essere in grado di suddividere i dati BC rilevanti in un database separato. I meccanismi per ottenere i dati attraverso le BC sono un'altra cosa e immagino che se ciò non può essere risolto potreste trovarlo in difficoltà.

Anche se non credo che l'identificazione jacket dal lato dei dati può essere idea migliore è certamente un passo nella giusta direzione :)

+0

Quindi stai dicendo, in realtà non importa se aggiungo clienti nella mia aC Le vendite dal momento che è buona per trattare ogni BC come un archivio dati separato? –

+0

Inoltre, quando dici che ho bisogno di un nome cliente denormalizzato nel mio dominio di vendita, vuoi dire che devo aggiungere un'altra colonna CustomerName nella mia tabella delle vendite? O vuoi dire che devo aggiungere l'intera tabella clienti nel mio edmx vendite (BC)? –

+0

Il fatto è questo: se si aggiunge il cliente al dominio di vendita diventa un VO poiché fornisce dati (solo una vista) e non si interagirebbe con esso. Forse il 'Cliente' nel dominio Vendite ha solo un ID e FullName, ma non" tira "nell'entità Cliente nel tuo dominio Vendite. d optare per il nome cliente denormalizzato nel dominio di vendita. Naturalmente tutto dipende dal contesto :) –

2

Se si desidera poter accedere all'entità Cliente dall'entità Vendite utilizzando una proprietà di navigazione, (Sale.Customer), sarà necessario aggiungerla a edmx di vendita.

Non è necessariamente una brutta cosa avere tutte le tue tabelle in un singolo edmx, purché tu lo crei, usalo per l'azione (s) che vuoi, e poi lo disfondi, il grafico dell'oggetto non lo farà diventa così grande

In alternativa, se si desidera mantenere i contesti limitati, è possibile disporre di un repository o di recuperarlo per ID quando è necessario.

var customer = customerContext.GetCustomerById(sale.CustomerId); 
8

Mi piace vista di Julie Lerman su questo argomento http://msdn.microsoft.com/en-us/magazine/jj883952.aspx

I utilizzare contesti limitati per le prestazioni di accesso poiché il tempo di caricamento di Contesti è più rapido quando si utilizzano dbcontexts più piccoli anche quando si utilizzano viste generate. La semplicità del modello di accesso è piacevole. Le prestazioni di considerano i suggerimenti su MS ef site: http://msdn.microsoft.com/en-us/data/hh949853

I BC consentono inoltre altri vantaggi come la limitazione dell'accesso ai problemi aziendali corrispondenti. I problemi maggiori sorgono se si prova a lavorare con contesti db che variano non solo in quale DBSet appare, ma si provano e si alterano le viste del Modello. Penso che sia meglio farlo al di fuori di EF e mappato.

Uso un contesto SUPERSET di grandi dimensioni per gestire la creazione/migrazione del database. Ma non l'accesso giornaliero.

I DBcontex più piccoli vengono utilizzati per l'accesso giornaliero ai dati di tutti i giorni.

Quindi sì, con tutti i mezzi usare contesti limitati. Questo può essere contro l'archivio dati SAME . E per rispondere alla domanda come formulata "Sì allo stesso tavolo (DbSet) può apparire in molti contesti.

+0

Come si fa a gestire le configurazioni di entità quando si aggiunge la stessa entità a più contesti, specialmente quando EF trascina le proprietà di navigazione attraverso la convenzione? Ho ulteriori informazioni sul problema [qui] (http://stackoverflow.com/questions/18486699/entity-configuration-management-with-ddd-bounded-contexts). –

+1

Sfortunatamente se la proprietà o la tabella 'ignore' non è sufficiente e vuoi specifiche opzioni di Navigazione specifiche sulle stesse tabelle, allora avrai bisogno di una classe di base NO nav. Class1: base con NVA aggiunto e class2 senza Nav. Questo aspetto è doloroso ma inevitabile se si dispone di tale requisito specifico. –

Problemi correlati