Mapeo Flexible – Ejemplo – Entity Framework Core 2.0

Cuando creamos un modelo, en ocasiones nos limitamos a utilizar propiedades que vendrían a representar columnas en una tabla de SQL Server. Para la mayoría de las ocasiones esto quizás sea suficiente, pero habrán otras situaciones en las cuales vamos a querer utilizar una combinación de propiedad y campo.  La idea entonces es que podremos utilizar un campo para representar una columna en una tabla de SQL Server, y utilizaremos la propiedad para realizar una transformación sobre la data que vamos a insertar. A esto le llamamos mapeo flexible.

La idea del mapeo flexible es poder mapear no solamente propiedades con columnas, sino campos con columnas. Una ventaja de hacer esto es que entonces podemos agregar una transformación de datos a la hora de insertar registros en nuestra base de datos. Así, si queremos siempre aplicar una transformación de datos a una información que insertemos en una tabla, la podremos hacer a nivel del modelo. Así, no importa desde donde utilices Entity Framework para realizar la inserción de la data, esta transformación siempre va a ser aplicada. Veamos un ejemplo.

Este ejemplo lo voy a hacer con Entity Framework Core 2.0.

Lo que vamos a hacer es que vamos a tomar un modelo llamado Student, el cual tiene una propiedad llamada Name, la cual guarda el nombre del estudiante. Vamos a agregar un campo que va a trabajar con la columna Name. Luego vamos a modificar la propiedad Name para que se encargue de hacer la siguiente transformación: Colocar la primera letra de cada palabra en mayúscula, y el resto en minúscula. Así, si le asignamos el string “juAn VAldeZ” a la propiedad Name, en la base de datos se va a guardar “Juan Valdez”.

Este es el modelo Estudiante el cual tiene la propiedad Name y el campo _Name

public class Student
    {
        public int Id { get; set; }
        private string _Name;
        public string Name { get
            {
                return _Name;
            }
            set {
                _Name = string.Join(' ',
                value.Split(' ').Select(x => x[0].ToString().ToUpper() + x.Substring(1).ToLower()).ToArray());
            }
        }

        public DateTime Birthdate { get; set; }

    }

Fíjate que ahora tenemos un campo llamado _Name, al cual se le asigna un valor a través de la propiedad Name. En el setter de la propiedad Name fíjate que estamos utilizando código de LINQ para cumplir con nuestro cometido. En resumen, este código toma el valor que le hayan pasado a la propiedad Name, la divide en sus distintas “palabras”, luego toma la primera letra de cada palabra y la coloca en mayúscula, y eso lo concatena con el resto de la palabra, en minúscula, luego une los resultados en un string final, y asigna dicho nuevo string al campo _Name.

Ahora lo que tenemos que hacer es decirle a Entity Framework que queremos asociar la columna Name con el campo _Name. Para esto debemos utilizar el API Fluente. Si no lo conoces, piensa en el API Fluente como una parte del Context (la clase que hereda de DbContext) en la cual podemos hacer ciertas configuraciones a cómo Entity Framework debe trabajar con nuestras tablas. La idea es que a través del API Fluente podemos personalizar algunas de las opciones de Entity Framework, como el nombre de las tablas, por ejemplo. Por ahora, vamos simplemente a colocar el siguiente código en la clase Context:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Student>().Property(x => x.Name).HasField("_Name");
}

El método OnModelCreating es donde hacemos las configuraciones del API Fluente. Como puedes ver, el código que colocamos dentro de este lo que hace es decirle a Entity Framework que la propiedad Name tiene un campo llamado _Name. Con esto, Entity Framework sabe que debe de tomar el valor del campo _Name para llenar la columna Name en la base de datos a la hora de insertar un registro. Vamos a probar esto:

using (var context = new ApplicationDbContext())
{
   var student1 = new Student();
   student1.Name = "juAn VAldeZ";
   student1.Birthdate = new DateTime(1987, 2, 5);
   context.Students.Add(student1);
   context.SaveChanges();
}

Como puedes ver, este código se encarga de insertar un estudiante cuyo nombre fue ingresado como “juAn VAldeZ”. Sin embargo, si corremos este código, y vamos a nuestra base de datos, veremos el siguiente resultado:

Chapter 3 - Flexible Mapping

 

Conclusión

Podemos utilizar Mapeo Flexible para asociar columnas de nuestra tabla de SQL Server con campos de nuestro modelo. La ventaja de esto es que nos permite aplicar transformaciones a nuestros valores previos a que Entity Framework los inserte en la base de datos.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s