2012-03-26 14 views
5

He creado un modelo de datos de entidad y he generado una base de datos a partir de él.Derivado de las clases generadas por Entity Framework en C#

Una de las entidades se llama Template.

Creado clases parciales para ampliar la funcionalidad de Template funciona bien.

Si se crea una nueva clase y tratar de derivar de Template, me sale una excepción de ejecución creando una instancia:

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

¿Cómo puedo evitar esto? Definitivamente necesito heredar de las clases de EF.

EDITAR

No parece posible. Si ese es el caso, ¿cuál sería la mejor manera de implementar el siguiente requisito: la entidad de plantilla almacena información sobre las plantillas que cada uno tiene su propio código para ejecutar. Es por eso que estaba intentando derivar de la entidad en primer lugar.

+0

Mira [esto] (http://stackoverflow.com/questions/2350514/ef-mapping-and-metadata-information-could-not-be-found-for-entitytype-error) y [this] (http://stackoverflow.com/questions/2247891/metadata-information-not-found-while-using-ef4s-poco-template) SO preguntas. – Attila

+0

¿Qué tipo de "su propio código" tiene en mente, y cómo debería EF entender la diferencia entre 'context.Template1s.Load()' vs. 'context.Template2s.Load()', cuando toda la base de datos tiene 'Plantilla'? ¿Podría dar un ejemplo de cómo piensa usar esto? – hvd

+0

@Attila: Gracias. El primer enlace mencionaba que EF no daba soporte a los Enums, lo que incidentalmente estaba usando en la clase parcial, pero eliminar eso tampoco funcionaba. Hasta ahora, parece que no hay solución, excepto la composición. ¿Alguna idea? –

Respuesta

4

¿Por qué necesita heredar de la clase de entidad en primer lugar? Si desea agregar un comportamiento simple, use una clase parcial.

Actualización: Según los comentarios, parece que existe la posibilidad de que el comportamiento se prolongue a lo largo del tiempo. En este caso, recomendaría usar composición/agregación, no herencia. Deje que las clases que necesitan extenderse tengan una entidad como campo. En el escenario de Raheel, sería una clase llamada TemplateLogic con campo/propiedad de tipo Template.

+0

El escenario es difícil de explicar, pero básicamente cada clase derivada implementará una funcionalidad personalizada que se agregará a la base de código a lo largo del tiempo. La entidad misma simplemente almacena qué clase de clase derivada se debe usar para procesar. –

+4

Entonces simplemente usa la composición, no la herencia. Deje que las clases que necesitan extenderse tengan una entidad como su campo. En su escenario, tendría una clase llamada TemplateLogic con campo/propiedad de tipo Template. –

+0

Gracias. Esto complicaría un poco el código, pero definitivamente funcionará. Si no encuentro una respuesta en herencia pronto, terminaré haciendo esto. –

5

No es compatible. No puede derivar un nuevo tipo de entidad y usarlo en lugar del tipo de entidad asignada para la persistencia. Si desea tener una clase derivada de una entidad, debe usar la herencia asignada donde cada hijo también se asigna a la base de datos.

+0

No puedo asignar las clases derivadas ya que no se usan para la persistencia. Se crean para implementar funciones en función de los datos de la entidad subyacente. –

+0

No, no funciona de esta manera. Si deriva la entidad y la usa para obtener datos de la base de datos o para guardar datos en la base de datos, se usa para la persistencia y también debe correlacionar la clase derivada. Si no puede asignarlo, significa que su herencia se utiliza de forma incorrecta y debe usar la composición propuesta por @Sergey. –

Cuestiones relacionadas