2011-10-10 8 views
6

Ho una domanda di progettazione relativa alle entità Entity Framework.Entity Framework Design - Multiple "Views" per i dati

Ho creato dell'entità seguenti:

public class SomeEntity { 
    // full review details here 
} 

Questa unità ha come esempio 30 colonne. Quando ho bisogno di creare una nuova entità, funziona alla grande. Ho tutti i campi richiesti per poter essere inserito nel database.

Ho alcuni punti nella mia app in cui ho bisogno di visualizzare alcuni dati tabulari con alcuni campi di SomeEntity, ma non ho bisogno di tutte le 30 colonne, forse solo di 2 o 3 colonne.

posso creare un'entità completamente nuova che ha solo i campi di cui ho bisogno (che associa allo stesso tavolo SomeEntity, ma recupera solo la colonna che voglio?)

o ha più senso per creare un classe di dominio (come PartialEntity) e scrivere una query come questa:

var partialObjects = from e in db.SomeEntities 
        select new PartialEntity { Column1 = e.Column1, Column2 = e.Column2 }; 

io non sono sicuro di quello che il modo appropriato per fare questo tipo di cose. È una cattiva idea avere due entità che si associano alla stessa tabella/colonne? Non avrei mai realmente bisogno della possibilità di creare un PartialEntity e salvarlo nel database, perché non avrebbe tutti i campi richiesti.

risposta

2

Il primo approccio non è possibile. EF non supporta più entità mappate sulla stessa tabella (ad eccezione di alcuni casi speciali come l'ereditarietà TPH o la divisione delle tabelle).

Il secondo caso è uno scenario comune. Creerai il modello di visualizzazione per l'interfaccia utente e indicherai la tua entità per visualizzare il modello direttamente nella query (passerà da solo le colonne DB che progetti) oppure interrogerai l'intera entità e convertirai in modello di visualizzazione nel codice dell'applicazione (ad esempio AutoMapper come menzionato da @Fernando).

Se si utilizza il file EDMX per la mappatura (suppongo che non lo si sia perché si è menzionato ) è possibile utilizzare il terzo approccio che prende parte a entrambi gli approcci menzionati. Questo approccio definisce QueryView - è una vista basata su EF sull'entità mappata che si comporta come una nuova entità di sola lettura. Generalmente è una proiezione riutilizzabile memorizzata direttamente nella mappatura.

+0

E il mio secondo approccio. È valido solo creare un POCO e scrivere una query che restituirà quell'oggetto interrogando le mie entità reali? – Dismissile

1

È possibile creare un metodo di filtro di proprietà generico che accetta un'istanza di oggetto e si passa a una serie di stringhe di nomi di colonne e questo metodo restituirebbe un oggetto dinamico con solo le colonne desiderate.

1

Penso che aggiungerebbe una complessità non necessaria al modello per aggiungere una seconda entità basata sulla stessa struttura di dati. Onestamente non vedo il problema di avere una singola entità per l'aggiornamento \ modifica \ visualizzazione. Se si insiste a separare l'accesso a SomeEntity, è possibile avere una vista del database: ad esempio SomeEntityView e creare un'entità separata basata su che.

2

Quello che hai proposto come prima soluzione è il "View model paradigm", in cui si crea una classe con il solo scopo di essere il modello di una vista per recuperare i dati e quindi associarli alla classe del modello. È possibile utilizzare AutoMapper per mappare i valori. Ecco un article su come applicare questo.

+0

Attualmente stiamo utilizzando AutoMapper per la creazione di modelli di visualizzazione. Questo scenario è leggermente diverso perché non voglio l'inefficienza di selezionare l'intera entità. Se ho recuperato 1000 righe con questa query: var data = da a in db.MainEntity seleziona a; e poi ho applicato la mappatura al mio tipo più piccolo, sono sicuro che EF non avrebbe fatto una query più intelligente. Ecco perché stavo chiedendo se dovevo creare un'entità più piccola o scrivere la query per fare da sola la "mappatura". – Dismissile

Problemi correlati