7

Secondo la MSDN il DbSet:Perché dovrei creare un pattern di repository con un'unità di lavoro nella parte superiore del mio EF?

DbSet<TEntity> Class 

A DbSet represents the collection of all entities in the context o che può essere interrogato dal database, di un dato tipo. Gli oggetti DbSet vengono creati da un DbContext utilizzando il metodo DbContext.Set.


E secondo il MSDN il DbContext:

DbContext Class 

Un DbContext instance represents a combination of the Unit Of Work and Repository patterns tale che esso può essere utilizzato per eseguire query da un database e raggruppare le modifiche che saranno poi scritto di nuovo al negozio come unità. DbContext è concettualmente simile a ObjectContext.


In modo che il EF utilizzare il repository pattern e la UOW internamente.

DbSet < ----> Repository

DbContext < ----> unità di lavoro

Perché dovrei costruire un modello di repository con un'unità di lavoro sulla parte superiore della il mio EF?

+2

Non dovresti. Anche se un livello di servizio in cui è possibile consolidare la logica aziendale è saggio. – Shoe

risposta

7

Perché dovrei creare un modello di repository con un'unità di lavoro nella parte superiore del mio EF?

Dipende da come si desidera gestire le proprie dipendenze.

Se Entity Framework è il livello di astrazione e il database stesso è la dipendenza, Entity Framework fornisce già i repository e l'unità di lavoro. Il compromesso è che il tuo dominio si basa su Entity Framework. Finché quella dipendenza è accettabile, sei bravo.

Se, al contrario, si desidera trattare Entity Framework come dipendenza che potenzialmente può essere sostituita senza apportare modifiche al codice di dominio, è necessario creare un'astrazione come wrapper attorno a tale.

Fondamentalmente, tutto si riduce a dove si disegna la linea di ciò che è o non è una "dipendenza esterna". Per alcuni progetti non importa, per alcuni è il database fisico, per alcuni è il quadro di accesso ai dati, ecc

+0

Great, Sometime Dovremmo usare EntityTypeMapping per rendere chiara la classe. (Usando FluentAPI). Quindi possiamo usare l'entità di dominio e non abbiamo bisogno di fare riferimento a EntityFramework – huoxudong125

7

Perché dovrei costruire un modello di repository con un'unità di lavoro sulla parte superiore della mia EF?

A causa dello Interface Segregation Principle.Le firme dei metodi in DbSet e DbContext sono fondamentalmente un grande pasticcio a basso livello, c'è un'enorme discrepanza tra loro e ciò che è normalmente previsto in un repository e in un'unità di lavoro. In altre parole, se si utilizza DbSet e DbContext direttamente, il codice del servizio applicativo subirà delle astrazioni che perdono.

Nel livello applicazione, è necessario manipolare la semantica appropriata. Il codice in quel livello deve solo parlare in termini di transazioni commerciali e grandi collezioni in cui è possibile recuperare e archiviare materiale. Questi sono concetti astratti minimalisti di altissimo livello. Il gergo Entity Framework è troppo sfocato e di basso livello per questo, quindi è necessario introdurre altri idiomi: Repository e UoW.

+0

Penso che sia la vera ragione. Ma a volte non abbiamo bisogno di Repository e UoW, se il nostro progetto è piccolo o semplice. possiamo fare riferimento a DbContext direttamente. – huoxudong125