VS 2010 SP1 y SQL CE

El mes pasado publicamos VS 2010 Service Pack 1(SP1) beta. Podéis aprender más de VS 2010 SP1 Beta de los dos post de Jason Zander, y del post de Scott Hanselman que cubre algunas de las nuevas capacidades que se le han añadido.

La semana pasada hablamos sobre el nuevo soporte de Visual Studio para IIS Express que hemos añadido en el SP1 de VS 2010. En el post de hoy vamos a ver las nuevas herramientas e VS 2010 SP1 para SQL CE, y veremos algunos escenarios de su aplicación.

SQL CE - ¿Qué es y porqué deberíamos conocerlo?

SQL CE es un motor de base de datos gratuito y embebido que permiten un almacenamiento sencillo.

No es necesaria instalación

SQL CE no necesita ejecutar ningún instalador de servidor para usarlo. Simplemente copiamos los binarios de SQL CE en el directorio bin de nuestra aplicación ASP.NET, y nuestra aplicación web podrá usarla como motor de base de datos. Sin instalación ni permisos de seguridad especiales para funcionar. No necesitamos una cuenta de administardor en la máquina. Compiando nuestra aplicación web en cualquier servidor y funcionará. Esto funciona incluso en entornos de ejecución de confianza parcial en un entorno de hosting web.

Funciona con APIs de datos actuales.

SQL CE 4 funciona con las APIs de datos actuales de .NET, y soporta una sintaxis similar a SQL Server. Es decir, podemos usar APIs como ADO.NET, incluso ORMs de alto nivel como Entity Framework y NHibernate con SQL CE. Esto nos permite aprovechar el conocimiento de estas APIs que ya tenemos.

Soporta escenarios de desarrollo, testing y producción.

SQL CE puede usarse para entornos de desarrollo, de testing y entornos de producción ligeros. Con SQL CE4 hemos hecho un verdadero trabajo de ingeniería para asegurarnos de que SQL CE no se rompe en escenarios de concurrencia con varios procesos (como ASP.NET). Este es un gran cambio con respecto a SQL CE - que fué diseñado para escenarios de cliente y que se bloqueaba explícitamente en entornos de servidores web. A partir de SQL CE 4 podemo usarlo en servidores web.

No hay restricciones de licencia en SQL CE. También es totalmente gratuita.

De fácil migración a SQL Server.

SQL CE es una base de datos embebida - lo que la hace ideal para entornos de desarrollo, testing y escenarios ligeros. Para sitios con un gran volumen de tráfico seguramente querremos migrar la base de datos a SQL Server Express (que es gratuito), SQL Server, o SQL Azure. Estos servidores ofrecen una mayor escalabilidad (incluyendo características como procedimientos almacenados, que no se soportan en SQL CE), así como otras capacidades de administración de datos más avanzadas.

Publicaremos herramientas de migración que noss permitirán pasar bases de datos SQL CE a SQL Server Express, SQL Server o SQL Azure de forma sencilla. no tendremos que cambiar nuestro código cuando hagamos esta migración. El objetivo es poder cambiar fácilmente la cadena de conexión a la base de datos en nuesro web.config y tener la apliación funcionando.

Nuevas herramientas para SQL CE en VS 2010 Sp1

VS 2010 SP1 incluye herramientas para trabajar cómodamente con SQL CE, y añade el soporte necesario para trabajar en ASP.NET contra SQL CE. Con VS 2010 Sp1 ahora podemos:

  • Crear bases de datos SQL CE.
  • Editar y modificar el esquema e indices de bases de datos SQL CE .
  • Rellenar bases de datos SQL CE con datos
  • Usar el diseñador de Entity Framework (EF) para crear capas de modelos contra bases de datos SQL CE.
  • Usar EF Code First para definir modelos en código, crear después la base de datos SQL CE, y editar la base de datos con VS.
  • Desplegar bases de datos SQL CE en servidores remotos usando Web Deploy y convertirlas a SQL Server.

Podemos aprovechar todas estas características tanto desde proyectos ASP.NET Web Forms como de ASP.NET MVC.

Descarga

Podéis habilitar el soporte para SQL CE en VS 2010 instaladon VS 2010 SP1(beta).

Una vez instalado el SP1, necesitáis instalar las herramientas de SQL CE para Visual Studio. Es una descarga separa que habilita las herramientas de SQL CE para VS 2010 SP1.

Ejemplo de dos escenarios

En este post vamos a ver cómo podemos aprovechar SQL CE y VS 2010 SP1 tanto en aplicaciones ASP.NET como en ASP.NET MVC. En concreto veremos:

  • Cómo crear una base de datos SQL CE con VS 2010 SP1, luego usaremos los diseñadores visuales de EF 4 en Visual Studio para crear un modelo para ella, y mostraremos y editaremos los datos usando un control GridView de ASP.NET
  • Cómo usar EF Code First para definir el modelo usando clases POCO y hacer que EF Code First auto genere la base de datos de SQLCE por nosotros basándose en esas clases. Después veremos cómo podemos usar el soporte de SQL CE de VS 2010 para consultar la base de datos que hemos creado, rellenarla con datos, y hacer cambios al esquema. Haremos todo esto en una aplicación ASP.NET MVC.

Podéis seguir estos tutoriales en vuestra propia máquina instalando VS 2010 SP1 (beta) e instalando despues las Herramientas de SQL CE para Visual Studio (que es una descarga a parte).

Primer escenario: Crear una base de datos SQL CE, Crear clases del modelo con EF, editar los datos con un GridView.

En este primer escenario veremos cómo crear y definir una base de datos SQL CE en una aplicación ASP.NET Web Forms. Luego crearemos una capa de modelo con EF para ella y usaremos ese modelo para habilitar la edición de datos con un <asp:GridView>.

Paso 1: Crear un nuevo proyecto ASP.NET Web Form.

Comenzaremos usando el comando File-> New Project de Visual Studio para crear un nuevo proyecto ASP.NET Web Forms. Usaremos la plantilla "ASP.NET Web Application ya que tiene un skin por defecto para la interfaz de usuario:

Paso 2: Crear la base de datos SQL CE

Hacemos clic derecho en el directorio "App_data" del proyecto que hemos creado seleccionamos la opcíon "Add->New Item":

Esto nos mostrará el cuadro de diálogo "Add Item". Seleccionamos el elemento "SQL Server Compact 4.0 Local Database" (nuevo en VS 2010 SP1) y le damos el nombre de archivo "Store.sdf":

Fijáos que los archivos de SQL CE tienen la extensión .sdf. Ponerlos en el directirio /App_Data del proyecto ASP.NET hace más fácil el despliegue.

Cuando hacemos clic en "Add" se añade el archivo Store.sdf al proyecto:

Paso 3: Añadir la tabla "Products":

Si hacemos doble clic en el archivo "Store.sdf" se abrirá el tab del explorador de servidores. Como es una base de datos nueva no hay ninguna tabla:

Hacemos clic derecho en el icono "Tables" y seleccionamos "Create Table¨ para crear una nueva tabla en la base de datos. Nombraremos a la tabla como "Products" y añadiremos 4 columnas. Marcamos la primera columna como clave primaria (y la hacemos como columna de identificación para que su valor se incremente automáticamente con cada nueva fila):

Cuando pulsamos "Ok" se creará la nueva tabla products en la base de datos.

Paso 4: Rellenar datos.

Una vez que hemos creado la tabla Products se nos mostrará en el explorador de servidores. Vamos a hacer clic derecho en ella y seleccionamos la opción de menú "Show Table Data" para editar sus datos:

Vamos a añadir algunas filas de ejemplo:

Paso 5: Crear el modelo de EF

Tenemos la base de datos SQL CE con algunos datos - vamos a crear la capa de Modelo con EF que nos ofrecerá una forma fácil de consultar y actualizar datos.

Hacemos clic derecho en el proyecto y seleccionamos la opción "Add->New Item". En el diálogo de "Add New Item" - seleccionamos el elemento "ADO.NET Entity Data model" y lo nombramos "Store.edmx":

Esto añadirá el elemento Store.edmx a nuestra solución y lanzará un asistente que nos permitirá crear rápidamente nuestro modelo:

Seleccionamos la opción "Generate From DataBase" y hacemos clic en next. Marcamos que use la base de datos Store.sdf que hemos creado y hacemos clic en next.

Este asistente nos preguntará qué objetos queremos importar a nuestro modelo. Seleccionamos importar la tabla "Products" que hemos creado:

Cuando hacemos clic en "Finish" Visual Studio abrirá el diseñador de EF. Tendrá una entidad Product que se mapea con la tabla "Products" en nuestra base de datos SQL CE:

El diseñador de VS 2010 SP1 EF funciona exactamente igual con SQL CE como con SQL Server o SQL Express. La entidad Product será persistida como una clase (Llamada "Product") con la que podemos programar en nuestra aplicación ASP.NET.

Paso 6: Compilar el proyecto.

Ántes de usar nuestro modelo necesitamos compilar el proyecto. Usamos Ctrl+Shift+B para compilar, o vamos a Build->Build Solution.

Paso 7: Crear una página que use el modelo de EF

Vamos a crear un Web Form de ASP.NET que contenga un GridView que usaremos para mostrar y editar los datos de productos (a través de la capa de EF que hemos creado).

Hacemos clic derecho en el proyecto y seleccionamos "Add->New Item". Seleccionamos la plantilla "Web Form from Master Page", y nombramos a la página "Products.aspx". Basaremos la master page en la plantilla "Site.Master" que está en la raíz del proyecto.

Añadimos la cabecera <h2>Products</h2> a la página, y añadimos un control <asp:gridview>:

Hacemos clic en el tab "Design" para pasar a la vista de diseño. Seleccionamos el control GridView, y hacemos clic en la esquina superior derecha del grid para mostrar los "Smart Task":

Seleccionamos la opción "New data source..." del desplegable. Esto nos mostrará el siguiente diálogo que nos permitirá seleccionar el tipo de Data source:

Seleccionamos la opción "Entity" - que nos permitirá conectar más fácilmente nuestro GridView al modelo EF que hemos creado. esto nos mostrará otro diálogo que nos permitirá seleccionar nuestro modelo:

Seleccionamos la opción "StoreEntities" del combo - que es el modelo EF que hemos creado. Hacemos clic en next - que nos permitira seleccionar qué entidad queremos enlazar:

Seleccionamos la entidad "Products" del diálogo - indicando así que queremos enlazarnos a la clase "Product" que hemos definido ántes. Hacemos clic en "Enable automatic updates" para asegurarnos de que podemos consultar y actualizar productos. Cuando hacemos clic en "Finish" VS añadira un <asp:EntityDataSource> al control <asp:GridView>:

Los últimos dos pasos que haremos será marcar el checkbox "Enable Editing" en el Grid (que hará que el grid muestre el enlace "Edit" en cada fila) y (opcionalmente) usará el diálogo AutoFormat para seleccionar una plantilla de interfaz de usuario para el grid.

Paso 8: Ejecutar la aplicación

Vamos a ejectuar nuestra aplciación y navegaremos a la página /Products.aspx que contiene nuestro GridView. Cuando hacemos esto veremos un grid de productos con los datos de nuestra base de datos SQL CE. Haciendo clic en el enlace "Edit" en cualquier fila nos permitirá editar sus valores:

Cuando hacemos clic en "update" el GridView mandará los valores, los persistirá a través de nuestro modelo EF, y se guardarán en la base de datos SQL CE.

Aprender más sobre el uso de EF con ASP.NET Web Forms.

Leed esta serie de tutoriales del sitio http://asp.net para aprender más sobre cómo usar EF con ASP.NET Web Forms.

Esta serie de tutoriales usan SQL Express como base de datos - pero lo bueno es que todos los mismo pasos/conceptos son también aplicables a SQL CE.

Segundo escenario: Usar EF Code First con SQL CE y ASP.NET MVC 3

Hemos usado la opción de primero crear la base de datos como en el ejemplo anterior - en el que primero creamos la base de datos, y luego usamos el diseñador de EF para crear las clases del modelo desde la base de datos.

Además de soportar el flujo de desarrollo basado en diseñadores, EF también nos permite una opción centrada en el código que llamamos "desarrollo code first". El desarrollo Code-First nos permite un flujo de desarrollo muy interesante. Nos permite:

  • Definir los objetos del modelo escribiendo clases PONO sin clases base ni con un diseñador visual.
  • Usar una solución "sin configuración" que nos permite persistencia de datos sin tener que configurar nada.
  • Sobreescribir opcionalmente la forma de persistencia usando una API de código para personalizar el mapping de la persistencia.
  • Crear opcionalmente una base de datos a partir de las clases del modelo que definamos - permitiéndonos empezar a programar primero.

He hecho varios post sobre EF Code First hce poco - creo que es realmente increible. Las buenas noticias es que también funciona muy bien con SQL CE.

La combinación de SQL CE, EF Code First, y las herramientasde VS para SQL CE, nos ofrecen un flujo de desarrollo muy interesante. Aquí tenemos un ejemplo simple sobre cómo podemos usarlo para crear una simple aplicación ASP.NET MVC 3.

Paso 1: Crear un nuevo proyecto ASP.NET MVC 3

Comenzaremos usando el comando "File->New Project" de Visual Studio para crear un nuevo proyecto ASP.NET MVC 3. Usaremos la plantilla "Internet Project" para que tenga una interfaz de usuario ya implementada:

Paso 2: Usar NuGet para instalar EFCodeFirst

Ahora usaremos el administrador de paquetes NuGet (instalado automáticamente por ASP.NET MVC 3) para añadir las librerías de EFCodeFirst a nuestro proyecto. Usaremos la línea de comandos del administrador de paquetes para hacerlo. Abrimos la consola en Visual Studio seleccionando la opción "View->Other Windows->Package Manager Console. Ahora escribimos:

install-package EFCodeFirst

en la consola para descargar la librería EFCodeFirst y añadirlas al proyecto:

Cuando escribimos el comando anterior, la librería EFCodeFirst se descargará y se añadirá a nuestra aplicación:

Paso 3: Crear algunas clases del modelo

Usando el desarrollo "Code First", crearemos primero nuestro modelo de clases (incluso ántes de tener la base de datos). Creamos estas clases escribiendo código.

Para este ejemplo, hacemos clic derecho en el directorio  "Models" del proyecto para añadir las siguientes tres clases al proyecto:

Las clases Dinner y RSVP son objetos POCO. No tienen que derivar de ninguna clase base o implementar ninguna interfaz, y las propiedades que exponen son tipos básicos de .NET. No hacen falta atributos de persistencia ni código de datos de ninguna clase.

La clase "NerdDinners" hereda de la clase DbContext (que es aportada por EFCodeFirst) y administra la obtención/persistencia de las clases Dinner y RSVP.

Paso 4: Listando Cenas

Hemos escrito todo el código necesario para implementar nuesro modelo para este proyecto.

Vamos aexponer y a implementar la URL: /Dinners/Upcomming en nuestro proyecto. La usaremos para mostrar un listado con todass las cenas que ocurrirán en el futuro.

Haremos esto haciendo clic derecho en el directorio "Controllers" seleccionando el menú "Add->Controller". Nombraremos a la clase como DinnersController. Implementaremos el método de acción "Upcoming" que mostrará la lista de de cenas usando nuestro nuestro modelo. Usaremos LINQ para consultar y obtener datos y pasarlos a la vista para renederizarlo con el código siguiente:

hacemos clic derecho en el método Upcoming y seleccionamos la opción "Add->View" para crear la plantilla de vista "upcoming que mostrará nuestras cenas. usaremos una plantilla vacía en el diálogo "Add->View" y escribiremos el siguiente código en la vista usando Razor:

Paso 4: Configurar nuestro proyecto para que use una base de dato SQL CE

Hemos terminado de escribir todo nuesro código - el último paso es configurar una cadena de conexión para la base de datos.

Apuntaremos la clase de modelo NerdDinners a una base de datos SQL CE añadiendo la siguiente <connectionString> al archivo web.config en la raíz de nuestro proyecto:

EF Code First usa una convención por defecto en el que las clases de contexto buscan una cadena de conexión que coincida con el nombre de la clase DbContext. Como hemos creado la clase "NerdDinners", también nombraremos a la cadena de conexión "NerdDinners". Arriba estamos configurando nuestra cadena de conexión para que use SQL CE como base de datos, y haciéndo esto el archivo de SQL CE se añadirá al directorio App_Data de nuestro proyecto.

Paso 5: Ejecutando nuestra aplicación.

Ahora que hemos creado nuestra aplicación vamos a ejecutarla.

Navegaremos a la URL /Dinners/Upcoming - de esta manera veremos una lista de cenas próximas:

Os estaréis preguntando - ¿pero donde hemos hecho la consulta para obtener las cenas?¿no hemos ni creado la base de datos?¡?

Una de las características que soporta EF Code First es la habilidad de crear automáticamente una base de datos (basándose en el esquema de nuestro modelo de clases) cuando no existe la base de datos que hemos configurado. Hemos configurado EF Code First para que apunte a una base de datos SQL CE en el directorio App_Data de nuestro proyecto. Cuando ejecutamos l a aplicación, EF Code First vió que no exisitía y la ha creado automáticamente.

Paso 6: Usar VS 2010 SP 1 para explorar nuestra nueva base de datos.

Haciendo clic en el icono "Show all Files" en el explorador de soluciones veremos el archivo "NerdDinners.sdf" que se ha creado automáticamente por EF Code First en el directorio App_Data:

Opcionalmente podemos hacer clic derecho en el archivo y seleccionar la opción "Include in Project" para añadirlo a nuestra solución:

También podemos hacer doble clic en el archivo (sini importar si está añadido al proyecto) y VS 2010 SP1 la abrirá para que podamos editarla en el exploradores de servidores en el IDE.

Aquí tenéis la vista que obtenemos cuando hacemos doble clic en el archivo NerdDinners.sdf. Podemos ver el esquema de las tablas Dinners y RSVPs en el arbol del explorador.

Fijáos cómo se han creado las dos tablas automáticamente en la base de datos SQL CE. Esto lo ha hecho EF Code First cuando accedimos a la clase NerdDinners ejecutando la aplicación:

Podemos hacer clic derecho en una tabla y usar el comando "Show Table Data" para meter algunas cenas en la base de datos:

Usaremos el editor de VS 2010 SP1 para generar datos:

Y ahora refrescaremos la url /dinners/Upcoming del navegador y veremos las próximas cenas:

Paso 7: Cambiando nuestro modelo y el esquema de la Base de datos.

Ahora vamos a modificar el esquema de nuestro modelo y la base de datos, y veremos cómo podemos usar las herramientas de VS 2010 SP1 para SQL CE para hacer esto más fácil.

Con EF Code First normalmente empezaríamos haciendo cambios en la base de datos modificando el modelo de clases. Por ejemplo, vamos a añadir una propiedad string nueva llamada "UrlLink" a la clase "Dinner". La usaremos para enlazar a más información sobre el evento:

Ahroa cuando ejecutamos el proyecto, y visitamos la url /Dinners/Upcoming veremos el siguiente error:

Estamos viendo este error porque EF Code First creó la base de datos, y por defecto cuando hace esto añade una tabla que ayuda a comprobar que el esquema de base de datos está sincronizado con nuestro modelo de clases. EF Code First lanza un error cuando se dessincronizan - haciendo más fácil encontrar incidencias en tiempo de desarrollo que de otra forma sólo encontraríamos (por medio de errores extraños) en tiempo de ejecución. Fijáos que si no queremos esta característica podemos desactivarla cambiando las opciones por defecto de nuestra clase DbContext (en este caso nuestra clase NerdDinners) para que no haga el seguimiento de los cambios de esquema.

Nuestras clases del modelo y el esquema de la base de datos no están sincronizadas -¿como lo arreglamos?. Tenemos dos opciones a día de hoy:

  • Borrar la base de datos y hacer que EF Code First recree la base de datos a partir del modelo (perdiento los datos que teníamos).
  • Modificar ele squema de la base de datos existente para resincronizarla con el modelo (manteniendo/migrando los datos que teníamos).

Hay un par de formas de hacer lo que se indica en el segundo punto. Ahora vamos a ver cómo podemos aprovechar las nuevas herramientas de VS 2010 SP1 para SQL CE para usar una herramienta para modificar el esquema de nuestra base de datos. También vamos a soportar la caracte´ristica de migración con EF en el futuro para permitir la automatización de migración de base de datos programáticamente.

Paso 8: Modificar el esquema de SQL CE con VS 2010 SP1

Las nuevas herramientas de SQL CE para VS 2010 SP1 hacen muy sencilla la modificación del esquema de una base de datos SQL CE existente. para ello hacemos clic derecho en la tabla "Dinners" y seleccionamos la opción "Edit Table Schema":

Esto nos mostrará el diálgo "Edit Table". podemos renombrar, cambiar o eliminar cualquiera de las columnas existentes, o hacer clic encima de la lista de columnas y escribir para añadir una nueva columna. Aquí hemos añadido una nueva columna "UrlLink" del tipo "nvarchar" (ya que nuestra propiedad es un string):

Cuando hacemos clic en ok nuestra base de datos se actualizará para tener una nueva columna en nuestro esquema y concidirá con nuestro modelo de clases.

Como estamos modificando manualmente el esquema de la base de datos, hay un paso más que tenemos que hacer para que EF Code First sepa que el esquema de la base de datos está sincronizado con nuestro modelo de clases. Como he comentado ántes, cuando se crea una base de datos por EF Code First añade la tabla "EdmMetadata" a la base de datos para realizar el seguimiento de versiones del esquema (y hace un hash a las clases del modelo para detectar diferencias entre el modelo y el esquema de la base de datos):

Como estamos actualizando manualmente y manteniendo el essquema de la base de datos, no necesitamos esta tabla - y podemos borrarla:

Esto nos deja con tan sólo dos tablas que se corresponden con nuestro modelo de clases:

Y ahora cuando ejectuamos la url /Dinners/Upcoming mostrará las cenas correctamente:

El último toque que podríamos hacer podría ser actualizar nuestra vista para que use la nueva propiedad UrlLink y renderizar un enlace <a> al evento:

Y ahora cuando actualizamos la url veremos los enlaces a los eventos en donde hemos guardao el enlace en la base de datos:

Resúmen

SQL CE ofrece un motor de base de datos gratutito y embebido que podemos usar para permitir almacenamiento fácilmente. Podemos aprovehcar las característica de SQL CE en proyectos y aplicaciones ASP.NET (tanto en Web Forms y MVC).

VS 2010 SP1 ofrece herramientas que nos permiten crear, edtiar y modificar fácilmente bases de datos SQL CE - así como usar el diseñádor estándar de EF. Esto nos permite reutilizar nuestras capacidades y conocimientos que ya tenemos para aprovhcar esta opción de base de datos embebida. Esto es útil tanto para pequeñas aplicaciones (en el que no se necesita la escalabilidad de un SQL Server), como para escenarios de desarrollo y testing - en los que queremos ser capaces de desarrollar/testear nuestra aplicación sin tener una instancia completa de base de datos.

SQL CE hace fácil migrar nuestros datos a un servidor SQL Server o SQL Azuer si queremos - sin tener que cambiar ningún código en nuesra aplicación. Todo l oque necesitamos es cambiar en los dos escenarios anteriores es sólo el valor de la cadena de conexión del web.config para tener nuestro código funcionando contra un SQL Server. ESto ofrece una gran flexibilidad a la hora de escalar nuestra aplciaciones empezando con una base de datos embebida  a medida que se vaya necesitando.

Espero que sirva,

Scott.

Traducido por: Juan María Laó Ramos.

Artículo original.

6 pensamientos en “VS 2010 SP1 y SQL CE

  1. Pingback: Releases de ASP.NET MVC 3, IIS Express, SQL CE 4, Web Farm Framework, Orchard, WebMatrix « Thinking in .NET

  2. Pingback: Visual Studio 2010 SP1 « Thinking in .NET

  3. Pingback: EF Code First y Data Scaffolding con ASP.NET MVC 3 Tools Update « Thinking in .NET

  4. mpereyra

    el proyecto parece interesante pero me gustaria tener un ejecutable para ver el codigo corriendo en mi maquina o un video
    gracias.

    Responder

Deja un comentario