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:
Que finalmente se mapeará en nuestro modelo con las siguientes entidades:
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()
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:
Llegaremos al siguiente modelo de EF:
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.
Hola, estoy tratando de hacer Entity Splitting entre 2 entidades per manda el siguiente error:
ResponderEliminarError 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
Hola Anónimo:
ResponderEliminarRevisa 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.
Yo lo estaba haciendo en C# pero me sirvio, gracias por orientarnos un poco
ResponderEliminar