Serializza oggetti Entity Framework senza caricamento lento

2

Ho uno scenario molto specifico che non sono sicuro sia possibile supportare completamente:

Ho un'applicazione ASP.NET che usa Entity Framework 6.3 per la sua gestione dei dati.

Ho anche una biblioteca di audit generica che uso per registrare quando vengono visualizzati specifici tipi di dati. Questa libreria è progettata per essere ignorante dei dati / oggetti che registra. Vorrei registrare gli oggetti creati da framework di entità in formato serializzato json.

Il problema che sto incontrando è quando tento di serializzare oggetti Entity Framework con riferimenti virtuali. Il processo di serializzazione attiverà un carico lento su tutte le proprietà virtuali.

Ci sono alcune soluzioni che lo fermeranno:

  1. Disattiva il caricamento lento per un contesto EF:

    public SomeContext () {    this.Configuration.LazyLoadingEnabled = false; }

  2. Crea un DTO da Entity Framework Object e serializza quello invece.

  3. Proietta i dati in un nuovo tipo durante la lettura dal contesto.

Sfortunatamente, le opzioni 1 e 3 sono fuori dal tavolo. Non posso tornare indietro e modificare il contesto per soddisfare le esigenze del logger per vari motivi, uno dei quali è che non sono il "proprietario" dei progetti che sto modificando. Lo stesso vale per la modifica dei tipi di dati restituiti.

Fondamentalmente sto provando a inserire i log senza influenzare la funzionalità dell'applicazione.

Questo lascia l'opzione 2. Potrei creare un DTO temporaneo, registrarlo e poi eliminarlo. Il problema con questo approccio è che chiunque stia aggiungendo i riferimenti di log necessita di una comprensione degli oggetti per creare un DTO. Immagino che potrei usare qualcosa come Automapper per aiutare con questo, ma, di nuovo, è decisamente molto più lavoro solo per aggirare il fatto che non possiamo semplicemente serializzare l'oggetto EF.

La mia domanda è, c'è un'opzione 4? Esiste un modo per serializzare un oggetto EF senza attivare il caricamento lazy senza tuttavia influire sul modo in cui la corrente dell'applicazione funziona?

Forse potrei fare qualche riflessione sull'oggetto EF e fare o copiare l'oggetto o più direttamente dirigere la serializzazione.

    
posta AnotherDeveloper 19.11.2016 - 00:18
fonte

1 risposta

1

Ecco il mio suggerimento.

Crea un'altra classe parziale per una delle tue classi Entity. Includi nella tua classe parziale un metodo Serialize() che serializza solo i campi che desideri ed esclude quei campi che sono pigri caricati.

Quando hai capito come farlo in modo affidabile, puoi scrivere a mano nuove classi parziali per ciascuna delle rimanenti classi di entità o creare una classe T4 che generi quelle classi per te.

    
risposta data 19.11.2016 - 01:06
fonte

Leggi altre domande sui tag