2012-03-26 16 views
5

Ho creato un modello di dati di entità e generato un database da esso.Derivante dalle classi generate da Entity Framework in C#

Una delle entità è denominata Template.

Le classi parziali create per estendere la funzionalità di Template funzionano correttamente.

Se creo una nuova classe e cercare di derivare da Template, ottengo un'eccezione di runtime su un'istanza:

Mapping and metadata information could not be found for EntityType 'Template001'.

Come posso aggirare questo? Ho sicuramente bisogno di ereditare dalle classi EF.

EDIT

Non sembra possibile. In questo caso, quale sarebbe il modo migliore per implementare il seguente requisito: L'entità modello memorizza informazioni sui modelli che ciascuno ha il proprio codice da eseguire. Questo è il motivo per cui stavo cercando di derivare dall'entità in primo luogo.

+0

Controlla [questo] (http://stackoverflow.com/questions/2350514/ef-mapping-and-metadata-information-could-non-be-found-for-entitytype-error) e [this] (http://stackoverflow.com/questions/2247891/metadata-information-not-found-while-using-ef4s-poco-template) QUINDI domande. – Attila

+0

Che tipo di "loro codice" hai in mente, e in che modo EF dovrebbe capire la differenza tra 'context.Template1s.Load()' vs. 'context.Template2s.Load()', quando tutto il database ha 'template'? Puoi dare un esempio di come intendi usarlo? – hvd

+0

@Attila: Grazie. Il primo link menzionava EF che non supportava Enum che usavo incidentalmente nella classe parziale, ma rimuovendo ciò non funzionava neanche. Finora sembra che non ci sia alcuna soluzione, tranne la composizione. qualche idea? –

risposta

4

Perché è necessario innanzitutto ereditare dalla classe di entità? Se si desidera aggiungere un comportamento semplice, utilizzare la classe parziale.

Aggiornamento: In base ai commenti, sembra che ci sia la possibilità che il comportamento verrà esteso nel tempo. In questo caso, raccomanderei l'uso di composizione/aggregazione, non ereditarietà. Lascia che le classi che devono essere estese abbiano un'entità come un campo. Nello scenario di Raheel, sarebbe una classe denominata TemplateLogic con campo/proprietà di tipo Template.

+0

Lo scenario è difficile da spiegare, ma in pratica ogni classe derivata implementerà funzionalità personalizzate che verranno aggiunte al codice base nel tempo. L'entità stessa memorizza semplicemente quale tipo di classe derivata dovrebbe essere utilizzata per elaborare. –

+4

Quindi usa semplicemente la composizione, non l'ereditarietà. Lascia che le classi che devono essere estese abbiano un'entità come se fosse un campo. Nel tuo scenario, avresti una classe chiamata TemplateLogic con campo/proprietà di tipo Template. –

+0

Grazie. Ciò complicherebbe un po 'il codice, ma funzionerà sicuramente. Se non trovo una risposta in eredità presto, finirò per farlo. –

5

Non è supportato. Non puoi ricavare un nuovo tipo dall'entità e usarlo al posto del tipo di entità mappata per la persistenza. Se si desidera avere una classe derivata dall'entità, è necessario utilizzare l'ereditarietà mappata in cui ogni bambino viene anche mappato al database.

+0

Impossibile mappare le classi derivate poiché non vengono utilizzate per la persistenza. Sono creati per implementare le funzioni in base ai dati di entità sottostanti. –

+0

No, non funziona in questo modo. Se si ottiene l'entità e la si utilizza per ottenere dati dal database o per salvare i dati nel database, questa viene utilizzata per la persistenza e si deve mappare anche la classe derivata. Se non puoi mapparlo, significa che la tua ereditarietà è usata in modo errato e dovresti usare la composizione come proposto da @Sergey. –

Problemi correlati