Entity Framework 4 CodeOnly - Introducción

Entity Framework 4.0 nos ofrece varias formas de generar nuestro modelo, la primera, y que ya existía en la primera versión del producto, era generar el modelo a partir de la base de datos. Esto nos obligaba a empezar diseñando la base de datos para luego generar nuestras clases, lo cual no es lo deseable.

Una segunda opción es el llamado model-first, en que primero diseñamos nuestras clases del dominio y a partir de plantillas T4 y WF – ya sea las plantillas que trae por defecto o unas creadas por nosotros mismos – nos permite generar el script para crear la base de datos. Esta opción, aun siendo mejor que la anterior no da lugar a mucho juego.

Si realmente lo que queremos es total flexibilidad y no usar ni el diseñador ni pelearnos con el xml del fichero .edmx, podemos obtener la funcionalidad que necesitamos mediante el uso de la librería Microsoft.Data.Entity.CTP y disponible aquí. Como podéis deducir por el nombre aun se encuentra en fase CTP pero ya podemos realizar bastantes cosas interesantes. Para los que hayan trabajado con nHibernate, CodeOnly es la alternativa a *Fluent nHibernate.

A continuación vemos un ejemplo sencillo de cómo se usaría CodeOnly para mapear una clase Student y su relación con otra clase Group:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }
}
public class Group
{
    public int Id { get; set; }
    public ICollection<Student> Students { get; set; }
}
public class CodeOnlyConfiguration : EntityConfiguration<Student>
{
    public CodeOnlyConfiguration()
    {
        // indicamos la clave primária
        HasKey(s => s.Id);
        Property(s => s.Id).IsIdentity();
        // indicamos que el nombre es requerido y long. max.
        Property(s => s.Name).HasMaxLength(125).IsRequired();
        // la relación con su constraint
        Relationship(s => s.Group)
            .FromProperty(g => g.Students)
            .HasConstraint((s, g) => s.GroupId == g.Id);
        // mapeo con la tabla de la BBDD
        MapSingleType(s =>
            new
            {
                ID = s.Id,
                StudentName = s.Name,
                Group_ID = s.GroupId
            })
            .ToTable("dbo.Students");
    }
}

Ejemplos con la herencia

Vamos a mostrar varios ejemplos en que usamos los diferentes tipos de herencia soportados por EF4: Table per Hierarchy (TPH),Table per Type (TPT) y Table per Concrete Class (TPC).

Nuestras clases del dominio serán las mismas para los tres ejemplos y representan una herencia muy simple – no creo que haga falta explicarlas 🙂 -:

Diagrama de clases

Por comodidad, añado los enlaces a los posts relacionados:

  1. Table per Hierarchy (TPH)
  2. Table per Type (TPT)
  3. Table per concrete Class (TPC)