Pintores (EF - Code First - TPH)


Registrar un nuevo pintor general



¿Qué es y Cómo funciona?

El siguiente ejemplo se basa en EF - Code First. El modelo tiene herencia de tipo TPH (Table per Hierarchy) y polimorfismo.

El Modelo es sencillo con una clase Pintor de la cual heredan 3 clases más:

  • PintorDiestro
  • PintorZurdo
  • PintorAmbidiestro
La clase pintor contiene una propiedad string Nombre así como un método virtual ManoPreferidaParaPintar que devuelve un string y que será sobreescrito por las clases heredadas para realizar el polimorfismo. No se añaden Data Annotations y será en el contexto con la API fluida de Code First ( + la convención de NombreClaseID) donde realizaremos la configuración de las relaciones entre tablas.

El contexto añade una entidad Pintor que enlazará con una tabla en BBDD. Además se sobreescribe OnModelCreating para el mapeo por TPH creando la columna discriminadora Type que tendrá valor Null, PintorDiestro, PintorZurdo o PintorAmbidiestro

Podemos ver un listado de los pintores (con una segunda columna "Lateralidad" donde comprobar el polimorfismo), introducir nuevos (del tipo deseado) y, editar o borrar cualquiera de ellos.


Actualización

Se ha añadido un campo nuevo Rating al modelo.

El alojamiento de la BBDD (smarterasp) no permite el borrado y la generación iniciando en el contexto por "DropDatabaseIfModelChanges" por un tema de permisos (ver). Así que se tomó el inicializador por defecto "CreateDatabseIfNotExists" añadiendo una migración de tipo Code First para actualizar la BBDD según el modelo con la ventana del "Package Manager Console".

 

Teoría

En el paradigma Code First de Entity FrameWork (basado en Domain-Driven Design (DDD)) se escriben primero las POCO clases, esto es, el modelo conceptual o dominio, y luego se crea la BBDD a patir de ellas.

Si además existe herencia entre clases tenemos 3 opciones:

  • TPH - Table per Hierarchy
    Recomendado si requerimos polimorfismo y subclases con pocas propiedades.
    En BBDD obtenemos una única tabla "padre" con un campo discriminatorio para las subclases heredadas.
  • TPT - Table per Type
    Recomendado si requerimos polimorfismo y subclases con muchas propiedades. En BBDD obtenemos las tablas "padre" e "hijas" con una relación 1-1 por el ID de la "padre".
  • TPC - Table per Concrete Type
    Recomendado si no requerimos polimorfismo. En BBDD obtenemos solo las tablas "hijas" al ser la entidad "padre" abstracta.

La versión Express de Visual Studio no permite añadir Entity Framework Power Tools para crear diagramas de las entidades, dicha extensión aseguraría que el modelo del dominio es el correcto y está perfectamente diseñado.

Parece que EF, a día de hoy (04/06/2014), no soporta interfaces pues no conoce como convertir dichos "contratos" a SQL. Espero que en versiones futuras de EF se pueda realizar Code First con interfaces añadiendo el polimorfismo por esta vía.

 

Configuración y Test

Se ha utilizado Visual Studio Express 2013 para Web y actualmente Visual Comunity 2015.
La programación se ha desarrollado con C#, Razor y acceso a Base de Datos por Entity Framework.

Las tablas mostradas en la aplicación se encuentran en un Microsoft® SQL Server® 2012 y actualmente en SQL de Azure

El alojamiento de las páginas se realizó en https://www.smarterasp.net con el plan .NET ADVANCE y actualmente se han movido a 2 Aplicaciones Web en Azure: una para este proyecto Web MVC y otra para un WCF usada en un ejemplo.

Se ha testeado con exito en diferentes navegadores y sistemas operativos, en pantallas de PC, tabletas y moviles.