Entity Framework: Como solucionar los problemas en la carga de la metadata!

Hacía tiempo que no “jugaba” con las últimas versiones de Entity Framework y esta tarde mientras estaba usando un control de tipo EntityDataSource me encontré conque al intentar usar el EDM de EF que tenía definido en el proyecto de Visual Studio el asistente de configuración de la fuente de datos subyacente me soltaba un error la mar de majo: “The metadata specified in the connection string could not be loaded. Consider rebuilding the web project to build assemblies that may contain metadata. The following error(s) ocurred: Unable to load the specified metadata resource”. Lógicamente, tras decir WTF me puse a tratar de solucionar el asunto porque necesitaba poder configurar ese EntityDataSource para una pequeña prueba de concepto…

image

Tras revisar que las cadenas de conexión estaban correctas en el Web.Config y que el problema no se debía al modelo de EF generado en Visual Studio 2013, me puse a bucear por la red en busca de este error y similares, y por suerte (y también por desgracia), me encontré con varias entradas reportando el problema para versiones anteriores a la 6.0 de EF…tras varias pruebas sin resultados, finalmente encontré un par de referencias que me llevaron a la solución al problema

En particular, el segundo enlace es el que contiene la descripción del problema y la solución dada por Diego de La Vega de Microsoft:

Certainly, the EntityDataSource that is part of .NET framework does not support EF6. When you get the error it is because the control is trying to load the model in the EF5 runtime, which does not support 2012 as the value for ProviderManifestToken.We have an updated version of the EntityDataSource in the works that supports the EF6 runtime, and the current plan is to make it available in a NuGet package.

  • In the meanwhile, it seems that there are two workarounds: – Editing your edmx file and replacing 2012 with 2008 then using EF5 instead of EF6
  • Using model binding for WebForms instead of a DataSource control.

Tras esto, me puse manos a la obra para probar si alguno de los dos workaround funcionaba empezando por el primero:

  • En Visual Studio 2013, edité el archivo .edmx de mi modelo y efectivamente, aparece la propiedad ProverManifestToken con el valor 2012.

image

  • Tras cambiar el valor de ese atributo de 2012 a 2008 y recompilar el proyecto, ya pude configurar sin problemas el control EntityDataSource y usarlo en mi POC…por lo que con el primer workaround, se soluciona el problema.

image

De acuerdo al mismo mensaje de Diego de La Vega, se estaba trabajando en una nueva versión de EntityDataSource que solucione este problema…desconozco si la nueva versión está disponible o no.

.NET Framework: Guía de tecnologías .NET para Aplicaciones de Negocio!

A través de este post de Greg Duncan me he enterado qué desde el pasado Build tenemos disponibles una serie de guías de tecnologías .NET para crear aplicaciones de negocio. En concreto, las guías disponibles se focalizan en dos grandes categorías de patrones para aplicaciones:

  • Patrones de aplicaciones establecidos, es decir, aplicaciones que usan patrones clásico de tecnología ya conocidos como Cliente/Servidor o Aplicaciones.
  • Patrones de aplicaciones emergentes, es decir, patrones en los que se tiene en cuenta conceptos y tecnologías emergentes qué tienen que formar parte de las apliaciones de presente y de futuro: nube y multi-dispositivo.

Established and emerging application patterns

Puedes descargarte la guía desde este enlace.

.NET Fx: Casos de estudio de uso de Windows Workflow Foundation!

Muchas veces me he preguntado (y me han preguntado) hasta que punto Windows Workflow Foundation (WF) ha tenido éxito como tecnología para el modelado de flujos de trabajo más allá del uso extendido que tiene en plataformas que lo implementan y usan como SharePoint, Dynamics, TFS o System Center. Y hoy, a través de este post Jurgen Willis por fin he encontrado una buena respuesta ya que recopila varios casos de estudio de uso de WF fuera de estas plataformas. Sin duda, una buena referencia qué tener a mano para cuando alguien nos haga la pregunta de si se usa o no WF en desarrollos a medida.

.NET Framework 3.5 Chart Controls: Como consumir los datos de un cubo de Analysis Services!

Hace unos meses que tenía pendiente escribir este post sobre como consumir los datos de un cubo de SQL Server Analysis Services (SSAS) dentro de los .NET Framework 3.5 Chart Controls. La verdad es que el tema tiene sus truquillos, aunque por suerte y gracias a alguna ayudita de los chic@s de CIC, conseguí hacer una pequeña prueba de como mostrar datos de un cubo de SSAS en un control de tipo gráfico de los Chart Controls…y de aquí a llevarlo a SharePoint coser y cantar ;-). Básicamente los pasos a seguir de forma resumida son los siguientes:

  • En primer lugar, añadir a nuestra capa de presentación un control de tipo Chart. En mi caso, cogí un proyecto de tipo Web.
  • Añadir a nuestro proyecto una referencia a Microsoft.AnalysisServices.AdmdClient para poder conectaros al cubo y devolver los datos necesarios.

image

  • En la vista de código de nuestra página ASP.NET añadir las referencias necesarias para configurar por un lado el chart control y acceder por otro al cubo de SSAS.

using System.Data;

using Microsoft.AnalysisServices.AdomdClient;

using System.Web.UI.DataVisualization;

using System.Web.UI.DataVisualization.Charting;

using System.Drawing;

  • Configurar de forma adecuada los distintos parámetros del cubo como escala, tipo de gráfico, etiquetas de los ejes, etc. Como esta parte es un tanto pesada, no os replico el código.
  • Probar la consulta al cubo SSAS dentro del SQL Server Management Studio para asegurarnos de que los datos que devuelve son los que esperamos.

image

  • En mi caso, la consulta es:

SELECT NON EMPTY { [Measures].[Internet Sales Amount] }

ON COLUMNS, NON EMPTY { ([Customer].[Country].[Country].ALLMEMBERS *

                        [Customer].[State-Province].[State-Province].ALLMEMBERS *

    [Customer].[City].[City].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION,

    MEMBER_UNIQUE_NAME ON ROWS FROM [Adventure Works] CELL PROPERTIES VALUE,

    BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME,

    FONT_SIZE, FONT_FLAGS

  • Replicar la consulta anterior en un método de la página ASP.NET. En este caso el método tendría que contener al menos el siguiente código:

                CadenaConsulta =

                    "SELECT NON EMPTY { [Measures].[Internet Sales Amount] }"+

                    " ON COLUMNS, NON EMPTY { ([Customer].[Country].[Country].ALLMEMBERS *" +

                    " [Customer].[State-Province].[State-Province].ALLMEMBERS *" +

                    " [Customer].[City].[City].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION," +

                    " MEMBER_UNIQUE_NAME ON ROWS FROM [Adventure Works] CELL PROPERTIES VALUE, BACK_COLOR," +

                    " FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS";

               

                CadenaConexion =

                    "Provider=MSOLAP.4;Data Source=SHAREPOINT-SSRS;Integrated Security=SSPI;" +

                    "Data Source=SHAREPOINT-SSRS;Initial Catalog=Adventure Works DW";

 

                 //Nos creamos un objeto de tipo CellSet para guardar los resultados de la consulta:

                CellSet CS_Auxiliar;               

 

                //Establecemos la conexión:

                AdomdConnection ADOM_Conexion =

                    new AdomdConnection();

                ADOM_Conexion =

                    this.Establecer_Conexion();

               

                //nos creamos un objeto de tipo ADOMDCommand:

                AdomdCommand ADOM_Control =

                    new AdomdCommand();

                ADOM_Control =

                    new AdomdCommand(CadenaConsulta, ADOM_Conexion);

 

                // Con el método ExecuteCellSet ejecutaremos la consulta que tenemos en ADOMDConsulta.

                // Los resultados se guardarán en un objeto de tipo CellSet:

                CS_Auxiliar =

                    ADOM_Control.ExecuteCellSet();

 

                // Cerramos la conexión:

                this.Cerrar_Conexion(ADOM_Conexion);

 

                // Retornamos el objeto CS_Consulta:

                return CS_Auxiliar;

  • Cómo se puede observar en el código anterior, simplemente:
    • He “pegado” en código la consulta que había probado en el SQL Server Management Studio.
    • A continuación especifico la cadena de conexión al cubo de SSAS. La clave de esta cadena está en especificar el proveedor adecuado (MSOLAP.4 para SSRS 2008), el servidor, fuente de datos y cubo.
    • A continuación se declaramos un objeto de tipo CellSet en el que almacenaremos los resultados devueltos al ejecutar la consulta al cubo de SSAS.
    • Creamos una instancia de AdomdConnection para conectarnos al cubo.
    • Abrimos la conexión al cubo.
    • Creamos una instancia de AdomdCommand a partir de la cadena de consulta al cubo y la cadena de conexión al mismo.
    • A continuación llamamos al método ExecuteCellSet() del objeto anterior para ejecutar la consulta y el resultado lo guardamos en el objeto de tipo CellSet.
    • Finalmente, cerramos la conexión al cubo.
    • Devolvemos el objeto CellSet puesto que será el que utilicemos para alimentar el chart control.
  • Los métodos para abrir y cerrar la conexión al cubo son los siguientes:

        // Método para abrir la conexión:

        private AdomdConnection Establecer_Conexion()

        {

            //Con el objto conexión establecemos la conexión a través de la propiedad

            //cadena de conexión que nos ha pasado el usuario:

            AdomdConnection ACon_Conexion=null;

            try

            {

                ACon_Conexion =

                    new AdomdConnection(CadenaConexion);  

                //Ahora abrimos esa conexión:

                ACon_Conexion.Open();

                string version =

                    ACon_Conexion.ClientVersion;  

                //Retornamos la conexión:

                return ACon_Conexion;

            }

            catch (Exception  ex)

            {

                return ACon_Conexion;

            }

        }  

        // Método para cerrar la conexión:

        private void Cerrar_Conexion(AdomdConnection ACon_Conexion)

        {

            ACon_Conexion.Close();

        }

  • Finalmente, si visualizamos nuestra página ASP.NET, el resultado que obtendremos es el siguiente:

image

Y hasta aquí llega este ejemplo sobre como mostrar datos de un cubo de SSAS en un chart control. Espero que el post os haya resultado interesante.

Ja.NET: Java Development Tools for .NET

Está claro que la web está llena de sorpresas, y seguro que esta a más de uno le sorprende…yo desde luego me he quedado sorprendido por esta iniciativa, aunque también la veo bastante lógica…y de que sorpresa estamos hablando? Pues de Ja.NET o lo que es lo mismo, un nuevo sitio de la comunidad dedicado a habilitar Java sobre .NET como entorno de primera clase para el desarrollo y ejecución de aplicaciones. Como se comenta en la página de Ja.NET,  la visión de esta iniciativa es la de Establecer una comunidad de interés, junto con una conjunto de proyectos enfocados en generar las herramientas y middleware requeridos para aprovechar las enormes inversiones que existen hoy en día en software Java sobre plataforma .NET.

image

El primer proyecto en el que se han embarcado en Ja.NET es el desarrollo del Java 5 JDK para .NET, denominado Ja.NET SE. El proyecto ya se encuentra en sus primeras fases de desarrollo, y ya se pueden descargar y probar las primeras builds.