martes, 10 de abril de 2012

Table Splitting y Entity Splitting en Entity Framework

Hay 2 conceptos de modelado en Entity Framework que podrían resultarnos útil en determinados escenarios. Estoy hablando de Table Splitting y Entity Splitting.

Table Splitting

Table Splitting hace mención al hecho de mapear una tabla a dos o más entidades de nuestro modelo, entre las cuales habrá una relación 1:1.

Los motivos que pueden empujarnos a llevar a cabo esta práctica podrían ser:

  • Dividir una entidad de nuestro modelo que tiene muchas propiedades, en varias entidades con menos campos y más manejables. Es decir, organizar mejor nuestro modelo.
  • Hacer lazy loading a determinados campos. Imagina que un campo es del tipo ntext y tiene “chorrocientos” caracteres que sólo consultaras en ocasiones muy puntuales. Sería una pena forzar, tanto la consulta SQL contra la base de datos como la carga del mismo dato en una entidad en memoria, cada vez que leyeras una entidad.

Un ejemplo sería una tabla como la siguiente:

clip_image001

Que finalmente se mapeará en nuestro modelo con las siguientes entidades:

clip_image002

Si te fijas, lo que hemos hecho ha sido:

  • Crear una entidad Producto mapeada contra la tabla Productos, con sólo la propiedad Descripcion (además de la propiedad IdProducto que es la clave de la tabla).
  • Crear una entidad Propiedad mapeada también contra la tabla Productos, con las propiedades del 1 al 6 (justo las que no están mapeadas en la entidad Producto y además también la propiedad IdProducto).
  • Crear una  asociación 1:1 entre ambas entidades.

A partir de aquí, para el tratamiento de esta entidad sólo debemos tener en cuenta algunos puntos de interés:

Insertar una entidad

Al insertar una entidad deberemos insertar en un solo paso (una llamada a SaveChanges) todas las entidades que hayamos creado como producto del Table Splitting. Es decir, algo como lo siguiente no funcionaría porque sólo estamos haciendo el insert de una entidad y no de sus entidades relacionadas  (incluso cuando todas las propiedades de las entidades relacionadas 1:1 en nuestro Table Splitting, admitan valores nulos):

Dim p As New Producto With {.IdProducto = 1, .Descripcion = "Xbox 360"}

ctx.Productos.AddObject(p)

 

ctx.SaveChanges()

 

clip_image003

Lo correcto sería:

Dim p As New Producto With {.IdProducto = 1, .Descripcion = "Xbox 360"}

ctx.Productos.AddObject(p)

 

Dim prop As New Propiedad

p.Propiedades = prop

 

ctx.SaveChanges()

 

Resumiendo, un INSERT tiene que  disponer de todos los campos de la tabla para llevar a cabo la operación.

Eliminar una entidad

Al igual que ocurre al insertar la entidad, deberá eliminarse toda la entidad como un bloque.

Entity Splitting

Esta técnica es justamente contraria a Table Splitting.

Con Entity Splitting lo que hacemos es mapear dos o más tablas de nuestra base de datos en una sola entidad en nuestro modelo.

El principal motivo para hacer Entity Splitting es, normalmente, aunar en una entidad del modelo varias tablas que conceptualmente son el mismo registro.

Por ejemplo, partiendo de las siguientes tablas de base de datos:

clip_image004

Llegaremos al siguiente modelo de EF:

clip_image005

clip_image006

Ahora un código como el siguiente grabará en ambas tablas de nuestra base de datos:

Dim p As New Productos

p.IdProducto = 1

p.Descripcion = "Xbox"

p.Propiedad1 = "360"

ctx.Productos.AddObject(p)

 

ctx.SaveChanges()

 

Espero haber dejado claro estos conceptos y que te sirvan de ayuda.

Un saludo.

3 comentarios:

  1. Hola, estoy tratando de hacer Entity Splitting entre 2 entidades per manda el siguiente error:
    Error 7 Error 3024: Hay un problema con los fragmentos de asignación a partir de la línea 2145:Debe especificar una asignación para todas las propiedades de clave

    ResponderEliminar
  2. Hola Anónimo:
    Revisa la ventana "detalles de la asignación" para comprobar que todo está mapeado correctamente.
    Siento no poder ayudarte más.
    Un saludo y gracias por comentar.

    ResponderEliminar
  3. Yo lo estaba haciendo en C# pero me sirvio, gracias por orientarnos un poco

    ResponderEliminar