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.

Microsoft Reporting Viewer y despliegue privado

Llevamos algún tiempo utilizando Microsoft Reporting Viewer y en entornos de hosting compartido donde no se tiene acceso al servidor, resulta imposible distribuir y ejecutar el run-time que recomienda Microsoft. Microsoft Report Viewer 2010 Redistributable Package

De este modo y a prueba “ensayo-error”, veremos cuales son los pasos necesarios para realizar una distribución privada de los ensamblados que necesita Microsoft Reporting Viewer para funcionar. Es decir, vamos a llevar a cabo un private deployment.

Nuestro entono de pruebas es un servidor Windows 2008 R2 y el despliegue privado ha sido probado tanto para un sitio web como para un proyecto de aplicación web.

Si subimos una aplicación sencilla con un solo formulario y un control ReportViewer y un fichero .rdlc (el informe en sí mismo), el primer error será el siguiente:

clip_image002

Este error nos informa de que no encuentra el ensamblado Microsoft.ReportViewer.Webforms. En realidad, cuando agregamos el control ReportViewer también se agregaron automáticamente las siguientes referencias a ensamblados de nuestro GAC:

·         Microsoft.ReportViewer.Common

·         Microsoft.ReportViewer.WebForms

Para solucionar este error, basta con copiar desde el GAC (C:\Windows\assembly\GAC_MSIL) los anteriores ficheros en el directorio \bin de nuestra aplicación.

Si volvemos a ejecutar de nuevo nuestra página con nuestro visor, ahora el error será el siguiente:

clip_image003

Vaya! Parece que también tendremos que copiar el ensamblado Microsoft.ReportViewer.ProcessingObjectModel a nuestro directorio \bin.

Hecho esto nuestro informe funcionará correctamente con un despliegue privado del run-time de Microsoft Reporting Viewer.

Un saludo.