Archivo de Agosto 2008

h1

Como carga Entity Framework los datos

Agosto 20, 2008

Imaginemos que tenemos una tabla Clientes y una tabla de Direcciones (un cliente puede tener varias direcciones) y generamos el modelo con el wizard de Visual Studio.

Si pedimos solo un objeto Cliente lo recibimos sin sus direcciones.

var ClienteObj = from p in context.Clintes select p where p.nombre=”Juan”;

Despues de estos cargamos los datos de las direcciones.

ClienteObj.Direcciones.Load();

Si volvemos a obtener el cliente, tambien se obtienen las direcciones sin tener que hacer el .Load() explicitamente. Porque?

Muy facil, Entity Framework cachea los datos para evitar viajes a la base de datos.  La primera vez que se pide un cliente la cache de EF (llamada ObjectStateManager) mantendra una vista del objeto que es devuelto. Al pedir las direcciones sucede lo mismo. La siguiente veces que pidamos el cliente, EF compara el key que es devuelto de la base de datos y descubre que ya lo tiene cacheado, de manera que devuelve el objeto cacheado que ya contenia las direcciones. Se puede controlar como se comporta la comparacion entre el objeto cacheado y el de la base de datos usando MergeOption al ejecutar la consulta:

http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

Si se quiere obtener siempre los datos de la base de datos se debe usar MergeOption.NoTracking (pero EF no mantendra un registro de los cambios por lo que sera util principalmente en escenarios de solo lectura).

De todas maneras sigue haciendo una llamada a la base de datos para obtener un objeto que ya tiene en memoria. Como evitar esto? Tambien es muy sencillo usando el metodo GetObjectByKey (o su gemelo mas seguro, TryGetObjectByKey).

Esto lo que hace es buscar una entidad especifica (usando su EntityKey) primero en el objectContext, si no lo encuentra entonces realiza la llamada a la base de datos. De esta manera en el escenario adecuado nos podemos ahorra una llamada a la base de datos. Un escenario asi seria:

  • una sola entidad
  • no se necesitan datos relacionados
  • no se necesita sincronizacion con la base de datos.

Hay que tener en cuenta que si el objeto no esta cacheado, se devuelve solo ese objeto y no los relacionados. Pero si por ejemplo ya teniamos cargadas las direcciones de un cliente no cacheado y solicitamos ese cliente, de la base de datos se obtiene el cliente y las direcciones se obtienen del contexto.

h1

Nuevos recursos para Visual Studio 2008 SP1 y EF

Agosto 18, 2008

Microsoft acaba de sacar hace poco el Service Pack 1 para Visual Studio 2008 y por supuesto al traer muchas novedades tambien han actualizado la documentacion.

Desde este enlace se pueden descargar los nuevos ejemplos para Entity Framework. Es una buena manera de ir introduciendose en esta nueva herramienta.

Por otro lado han actualizado los training kit para el SP1 de .NET Framework 3.5 y Visual Studio 2008. Contiene presentaciones, hand-on labs, demostraciones, etc todo de gran utilidad para conocer las nuevas funcionalidades. En esta pagina se pueden consultar los contenidos y desde esta otra pagina .NET Fx 3.5 Enhancements Training Kit se puede realizar la descarga del training kit.

Voy a acabar de instalar el SP1 y les echare un vistazo.

h1

Uso de CPU en Entity Framework

Agosto 17, 2008

Jorge Roman me acaba de comentar mediante Twitter que esta teniendo problemas de CPU usando Entity Framework. He estado mirando documentacion y mirando el foro de Entity Framework parece ser que esto se da al realizar la materealizacion del modelo.

Una de las personas comentaba que tenia una base de datos de mas de 500 tablas. Tratando de ejecutar el siguiente codigo:

ObjectQuery customerQuery = myContext.Customer.Include(“CustomerType”);

List custList = customerQuery.ToList();

al llegar a la segunda linea el uso de CPU se disparaba al 100% y se mantenia constante durante 5 minutos!!!

Por lo visto esto es algo que el equipo de EF conoce y estan trabajando en ello para la version 2. De momento dan varias “soluciones”:

  • Usar solo las tablas que vayamos a necesitar. Es decir si tenemos 50 tablas y solo vamos a usar 10, incluir solo esas 10 en el modelo.
  • Crear varios modelos. Dividir nuestra base de datos en varios submodelos reduce los tiempos, ya que no sera habitual usarlos todos a la vez. (Tengo que investigar la manera de relacionarlos entre si)
  • Usar vistas precompiladas. De esta manera pasamos el coste de cpu al tiempo de compilacion. Puede ser un poco engorroso si nuestro modelo sufre bastantes cambios y hay varios desarrolladores implicados.

Como generar las vistas precompiladas:
1. Añadir un *.edmx al proyecto

2. Guardar todo

3. Click derecho en el proyecto desde el explorador de soluciones y darle a “Unload Project”

4. Click derecho otra vez y seleccionar “Edit projectname.csproj”

5. Añadir este trozo de XML antes del tag de cierre del proyecto.

<Target Name=BeforeCompile Inputs=$(ProjectDir)\Model1.edmx Outputs=$(ProjectDir)\MyViews.cs>

<Exec Command=%25WINDIR%25\Microsoft.NET\Framework\v3.5\EdmGen.exe /nologo /mode:viewgeneration “/incsdl:$(TargetDir)\Model1.csdl” “/inssdl:$(TargetDir)\Model1.ssdl” “/inmsl:$(TargetDir)\Model1.msl” “/outviews:$(ProjectDir)\MyViews.cs” />

</Target>

Cambiar las letras en negrita segun la nomenclatura usada en nuestro proyecto. Para VB hay que añadir /language:VB.

6. Recargar el proyecto

7. Compilar

8. Añadir MyViews.cs para que sea incluido en compilacion

* Esto es un traduccion de un post de Jaroslaw Kowalski.

De todas maneras tengo que seguir revisando cosas, por que no me acaban de convencer las soluciones aportadas.

h1

Google Insights for Search

Agosto 16, 2008

Hace poco Google ha sacado una nueva herramienta, se trata de Google Insights for Search. Se trata de una version de Google Trends pero con mas funcionalidades.

En la empresa en la que trabajo actualmente se le quiere dar una mayor importancia a lo que se ha dado en llamar Web 2.0, y creo que esta herramienta puede sernos de ayuda.

Con ella podemos ver desde donde se realizan las busquedas de los terminos que nos interesen, que busquedas hay relacionadas con ellas, como evolucionan con el tiempo. Todo esto puede ser de gran utilidad para poder identificar zonas donde tu producto puede tener mayor aceptacion, que caracteristicas busca sobre tus productos, etc.

Por ejemplo al realizar una consulta con “ventana pvc” buscando en España se nos muestra esto:

Parte Superior

Parte Superior

Parte Inferior

Parte Inferior

Si se hace la busqueda a nivel mundial se nos muestra el interes por paises. Se puede ver que tras España parece que en Chile y Guatemala es donde mas interes hay por las ventanas de pvc.

Busqueda segun paises

Busqueda segun paises

También se pueden ver las ciudades concretas:

Busqueda segun ciudades

Busqueda segun ciudades

En resumen: se trata de una herramienta que nos puede proporcionar mucha informacion sobre el interes que despiertan nuestros productos y los de la competencia, donde puede haber mas mercado e incluso saber que es lo que mas interesa del producto (En las busquedas que he hecho con “ventanas pvc” se ve que mucha gente esta interesada en presupuestos mas que en informacion tecnica).