Devo ignorare il repository per una stored procedure che restituisce dati flat (più oggetti come uno solo)?

1

Sto utilizzando il pattern del repository come metodo per accedere a DbContext nella mia applicazione C #, tuttavia, ho un report che genera una query costosa (in realtà diverse query) a causa di relazioni (e codice scritto male).

Poi ho creato una stored procedure che restituisce esattamente ciò di cui ha bisogno il report, senza campi aggiuntivi, quindi posso riempire le entità correnti e le proprietà di navigazione.

In questo caso, quale dovrebbe essere la strada da percorrere? Crea una nuova entità / repository solo per questo rapporto?

    
posta Juliano Nunes Silva Oliveira 12.08.2016 - 15:46
fonte

1 risposta

0

Create a new entity/repository just for this report?

Nuove entità, sì, repository, no. Ma vengo a questa risposta da una prospettiva leggermente diversa:

Penso che sia sempre una buona idea avere un DbContext sottotipo separato per la segnalazione. Questo contesto specializzato può essere ottimizzato per le prestazioni rendendolo di sola lettura:

  • Disattiva il caricamento lento e la creazione di proxy:

    context.Configuration.ProxyCreationEnabled = false;
    
  • Disattiva rilevamento modifiche:

    context.Configuration.AutoDetectChangesEnabled = false;
    
  • (Forse) disabilita la convalida:

    context.Configuration.ValidateOnSaveEnabled = false;
    

    Ma sarebbe utile solo se c'è la possibilità che vengano fatte chiamate di SaveChanges involontarie.

  • Disattiva il salvataggio delle modifiche eseguendo l'override del metodo SaveChanges senza chiamare base.SaveChanges .

Inoltre, se il contesto espone anche proprietà DbSet<T> , dovresti usarli con AsNoTracking() , che impedirà il tracciamento delle entità.

Se hai un tale contesto, è più ovvio utilizzarlo con entità specializzate, non con le entità che appartengono all'altra, i contesti aziendali. Questo può essere entità che acquisisce esattamente il risultato di una stored procedure. È anche possibile popolare più entità con una stored procedure .

W.r.t. repository - Io non sono un fan di loro comunque. I repository, se usati con EF, dovrebbero essere repository generici . I repository generici non contengono metodi specifici per tipo, quindi finiscono sempre per essere un involucro sottile (praticamente inutile) attorno a DbSet s. Puoi anche lavorare con DbSet s direttamente (o con l'output delle stored procedure).

Un'altra cosa da ricordare: anche con queste ottimizzazioni, EF non è lo strumento più veloce per leggere i dati da un database. Potresti voler dare un'occhiata a Dapper .

    
risposta data 12.08.2016 - 23:28
fonte

Leggi altre domande sui tag