Acceso a datos y modelos de ASP.NET MVC 4

Por el equipo de Web Camps

Descarga del kit de formación de Web Camps

En este laboratorio práctico se asume que tiene conocimientos básicos de ASP.NET MVC. Si no ha usado ASP.NET MVC antes, le recomendamos que vaya al laboratorio práctico de Aspectos básicos de ASP.NET MVC 4.

Este laboratorio le guía por las mejoras y las nuevas características descritas anteriormente mediante la aplicación de cambios menores a una aplicación web de ejemplo proporcionada en la carpeta Source.

Nota:

Todos los fragmentos de código y el código de ejemplo se incluyen en el Kit de formación de Web Camps, disponible en Microsoft-Web/WebCampTrainingKit Releases. El proyecto específico de este laboratorio está disponible en Modelos y acceso a datos de ASP.NET MVC 4.

En el Laboratorio práctico de aspectos básicos de ASP.NET MVC, ha pasado datos codificados de forma rígida de los controladores a las plantillas View. Sin embargo, para compilar una aplicación web real, es posible que quiera usar una base de datos real.

Este laboratorio práctico le mostrará cómo usar un motor de base de datos para almacenar y recuperar los datos necesarios para la aplicación Music Store. Para ello, comenzará con una base de datos existente y creará el Entity Data Model a partir de ella. A lo largo de este laboratorio, conocerá el enfoque Database First, así como el enfoque Code First.

Sin embargo, también puede usar el enfoque Model First, crear el mismo modelo mediante las herramientas y, a continuación, generar la base de datos a partir de ella.

Database First vs. Model First

Database First frente a Model First

Después de generar el modelo, realizará los ajustes adecuados en StoreController para proporcionar las vistas de la tienda con los datos tomados de la base de datos, en lugar de usar datos codificados de forma rígida. No tendrá que realizar ningún cambio en las plantillas de vista porque StoreController devolverá los mismos ViewModels a las plantillas de vista, aunque esta vez los datos provendrán de la base de datos.

El enfoque Code First

El enfoque Code First nos permite definir el modelo a partir del código sin generar clases que generalmente están acopladas con el marco de trabajo.

En Code First, los objetos de modelo se definen con POCO, "Plain Old CLR Objects" (Objetos CLR antiguos sin formato). Los POCO son clases simples sin formato que no tienen herencia y no implementan interfaces. Podemos generar automáticamente la base de datos a partir de ellos, o podemos usar una base de datos existente y generar la asignación de clases a partir del código.

Las ventajas de usar este enfoque es que el modelo sigue siendo independiente del marco de persistencia (en este caso, Entity Framework), ya que las clases POCO no están acopladas con el marco de asignación.

Nota:

Este laboratorio se basa en ASP.NET MVC 4 y una versión de la aplicación de ejemplo Music Store personalizada y minimizada para ajustarse solo a las características que se muestran en este laboratorio práctico.

Si quiere explorar toda la aplicación del tutorial de Music Store, puede encontrarla en MVC-Music-Store.

Requisitos previos

Debe tener los siguientes elementos para completar este laboratorio:

Configuración

Instalación de fragmentos de código

Para mayor comodidad, gran parte del código que va a administrar a lo largo de este laboratorio está disponible como fragmentos de código de Visual Studio. Para instalar los fragmentos de código, ejecute archivo.\Source\Setup\CodeSnippets.vsi.

Si no está familiarizado con los fragmentos de código de Visual Studio Code y quiere obtener información sobre cómo usarlos, puede consultar el apéndice de este documento "Apéndice C: Usar fragmentos de código".


Ejercicios

Este laboratorio práctico está compuesto por los siguientes ejercicios:

  1. Ejercicio 1: Agregar una base de datos
  2. Ejercicio 2: Crear una base de datos con Code First
  3. Ejercicio 3: Consultar la base de datos con parámetros

Nota:

Cada ejercicio va acompañado de una carpeta End que contiene la solución resultante que debe obtener después de completar los ejercicios. Puede usar esta solución como guía si necesita ayuda adicional para trabajar con los ejercicios.

Tiempo estimado para completar este laboratorio: 35 minutos.

Ejercicio 1: Agregar una base de datos

En este ejercicio, aprenderá a agregar una base de datos con las tablas de la aplicación MusicStore a la solución para consumir sus datos. Una vez generada la base de datos con el modelo y agregada a la solución, modificará la clase StoreController para proporcionar la plantilla de vista con los datos tomados de la base de datos, en lugar de usar valores codificados de forma rígida.

Tarea 1: Agregar una base de datos

En esta tarea, agregará una base de datos ya creada con las tablas principales de la aplicación MusicStore a la solución.

  1. Abra la solución Begin ubicada en la carpeta Source/Ex1-AddingADatabaseDBFirst/Begin/.

    1. Tendrá que descargar algunos paquetes NuGet que faltan antes de continuar. Para ello, haga clic en el menú Proyecto y seleccione Administrar paquetes NuGet.

    2. En el cuadro de diálogo Administrar paquetes NuGet, haga clic en Restaurar para descargar los paquetes que faltan.

    3. Por último, para compilar la solución, haga clic en Compilar | Compilar solución.

      Nota:

      Una de las ventajas de usar NuGet es que no es necesario enviar todas las bibliotecas del proyecto, lo que reduce el tamaño del proyecto. Con NuGet Power Tools, especificando las versiones del paquete en el archivo Packages.config, podrá descargar todas las bibliotecas necesarias la primera vez que ejecute el proyecto. Este es el motivo por el que tendrá que ejecutar estos pasos después de abrir una solución existente desde este laboratorio.

  2. Agregue el archivo de base de datos MvcMusicStore. En este laboratorio práctico, usará una base de datos ya creada denominada MvcMusicStore.mdf. Para ello, haga clic con el botón derecho en la carpeta App_Data, seleccione Agregar y, a continuación, haga clic en Elemento existente. Vaya a \Source\Assets y seleccione el archivo MvcMusicStore.mdf.

    Adding an Existing Item

    Agregar un elemento existente

    MvcMusicStore.mdf database file

    Archivo de base de datos MvcMusicStore.mdf

    La base de datos se ha agregado al proyecto. Incluso cuando la base de datos se encuentra dentro de la solución, puede consultarla y actualizarla tal como se hospedó en otro servidor de bases de datos.

    MvcMusicStore database in Solution Explorer

    Base de datos MvcMusicStore en el Explorador de soluciones

  3. Compruebe la conexión a la base de datos. Para ello, haga doble clic en MvcMusicStore.mdf para establecer una conexión.

    Connecting to MvcMusicStore.mdf

    Conexión a MvcMusicStore.mdf

Tarea 2: Crear un modelo de datos

En esta tarea, creará un modelo de datos para interactuar con la base de datos agregada en la tarea anterior.

  1. Cree un modelo de datos que represente la base de datos. En Explorador de soluciones, haga clic con el botón derecho en la carpeta Models, apunte a Agregar y, a continuación, haga clic en Nuevo elemento. En el cuadro de diálogo Agregar nuevo elemento, seleccione la plantilla Datos y, a continuación, el elemento Entity Data Model de ADO.NET . Cambie el nombre del modelo de datos a StoreDB.edmx y haga clic en Agregar.

    Adding the StoreDB ADO.NET Entity Data Model

    Adición del Entity Data Model de ADO.NET StoreDB

  2. Aparecerá el Asistente para Entity Data Model. Este asistente le guiará a través de la creación de la capa de modelo. Puesto que el modelo se debe crear en función de la base de datos existente agregada recientemente, seleccione Generar desde la base de datos y haga clic en Siguiente.

    Choosing the model content

    Elección del contenido del modelo

  3. Dado que está generando un modelo a partir de una base de datos, deberá especificar la conexión que se va a usar. Haga clic en Nueva conexión.

  4. Seleccione Archivo de base de datos de Microsoft SQL Server y haga clic en Continuar.

    Choose data source

    Cuadro de diálogo Elegir origen de datos

  5. Haga clic en Examinar y seleccione la base de datos MvcMusicStore.mdf ubicada en la carpeta App_Data y haga clic en Aceptar.

    Connection properties

  6. La clase generada debe tener el mismo nombre que la cadena de conexión de entidad, por lo que cambie su nombre a MusicStoreEntities y haga clic en Siguiente.

    Choosing the data connection

    Elección de la conexión de datos

  7. Elija los objetos de base de datos que se van a usar. Dado que Entity Model usará solo las tablas de la base de datos, seleccione la opción Tablas y asegúrese de que también se seleccionan las opciones Incluir clave externa en el modelo y Pluralizar o singularizar los nombres de objeto generados. Cambie el espacio de nombres del modelo a MvcMusicStore.Model y haga clic en Finalizar.

    Choosing the database objects

    Elección de los objetos de base de datos

    Nota:

    Si se muestra un cuadro de diálogo Advertencia de seguridad, haga clic en Aceptar para ejecutar la plantilla y generar las clases para las entidades del modelo.

  8. Aparecerá un diagrama de entidades para la base de datos, mientras que se creará una clase independiente que asigne cada tabla a la base de datos. Por ejemplo, la tabla de Álbumes se representará mediante una clase Album, donde cada columna de la tabla se asignará a una propiedad de clase. Esto le permitirá consultar y trabajar con objetos que representan filas en la base de datos.

    Entity diagram

    Diagrama de entidades

    Nota:

    Las plantillas T4 (.tt) ejecutan código para generar las clases de entidades y sobrescribirán las clases existentes con el mismo nombre. En este ejemplo, las clases de "Álbum", "Género" y "Artista" se sobrescriben con el código generado.

Tarea 3: Compilar la aplicación

En esta tarea, comprobará que, aunque la generación de modelos ha quitado las clases de modelo de Álbum, Género y Artista, el proyecto se compila correctamente mediante las nuevas clases de modelo de datos.

  1. Compile el proyecto seleccionando el elemento de menú Compilar y, a continuación, Compilar MvcMusicStore.

    Building the project

    Compilar el proyecto

  2. El proyecto se compila correctamente. ¿Por qué sigue funcionando? Funciona porque las tablas de base de datos tienen campos que incluyen las propiedades que estaba usando en las clases Álbum y Género que se han quitado.

    Builds succeeded

    Compilaciones correctas

  3. Aunque el diseñador muestra las entidades en un formato de diagrama, son realmente clases de C#. Expanda el nodo StoreDB.edmx en el Explorador de soluciones y, a continuación, StoreDB.tt, verá las nuevas entidades generadas.

    Generated files

    Archivos generados

Tarea 4: Consultar la base de datos

En esta tarea, actualizará la clase StoreController para que, en lugar de usar datos codificados de forma rígida, consulte la base de datos para recuperar la información.

  1. Abra Controllers\StoreController.cs y agregue el siguiente campo a la clase para contener una instancia de la clase MusicStoreEntities, denominada storeDB:

    (Fragmento de código: Modelos y acceso a datos: Ex1 storeDB)

    public class StoreController : Controller
    {
        private MusicStoreEntities storeDB = new MusicStoreEntities();
    
  2. La clase MusicStoreEntities expone una propiedad de colección para cada tabla de la base de datos. Actualice el método de acción Browse para recuperar un género con todos los Álbumes.

    (Fragmento de código: Modelos y acceso a datos: Ex1 Store Browse)

    public ActionResult Browse(string genre)
    {
        // Retrieve Genre and its Associated Albums from database
        var genreModel = new Genre
        {
            Name = genre,
            Albums = this.storeDB.Albums.ToList()
        };
    
        return this.View(genreModel);
    }
    

    Nota:

    Está usando una funcionalidad de .NET denominada LINQ (consulta integrada en lenguaje) para escribir expresiones de consulta fuertemente tipadas en estas colecciones, que ejecutarán código en la base de datos y devolverán objetos en los que puede programar.

    Para obtener más información sobre LINQ, visite el sitio de MSDN.

  3. Actualice el método de acción Index para recuperar todos los géneros.

    (Fragmento de código: Modelos y acceso a datos: Ex1 Store Index)

    public ActionResult Index()
    {
        var genres = this.storeDB.Genres;
    
        return this.View(genres);
    }
    
  4. Actualice el método de acción Index para recuperar todos los géneros y transformar la colección en una lista.

    (Fragmento de código: Modelos y acceso a datos: Ex1 Store GenreMenu)

    // GET: /Store/GenreMenu
    [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = this.storeDB.Genres.Take(9).ToList();
    
        return this.PartialView(genres);
    }
    

Tarea 5: Ejecución de la aplicación

En esta tarea, comprobará que la página Índice del almacén mostrará ahora los géneros almacenados en la base de datos, en lugar de los codificados de forma rígida. No es necesario cambiar la plantilla View porque StoreController devuelve las mismas entidades que antes, aunque esta vez los datos provienen de la base de datos.

  1. Vuelva a compilar la solución y presione F5 para ejecutar la aplicación.

  2. El proyecto se inicia en la página Principal. Compruebe que el menú de Géneros ya no es una lista codificada de forma rígida y que los datos se recuperan directamente de la base de datos.

    Screenshot shows a music genre page where you can verify the Genres menu.

    Exploración de géneros desde la base de datos

  3. Ahora vaya a cualquier género y compruebe que los álbumes se rellenan desde la base de datos.

    Screenshot shows a view where you can browse albums from the database.

    Exploración de álbumes desde la base de datos

Ejercicio 2: Creación de una base de datos mediante Code First

En este ejercicio, aprenderá a usar el enfoque Code First para crear una base de datos con las tablas de la aplicación MusicStore y cómo acceder a sus datos.

Una vez generado el modelo, modificará StoreController para proporcionar la plantilla View con los datos recogidos de la base de datos, en lugar de usar valores codificados de forma rígida.

Nota:

Si ha completado el ejercicio 1 y ya ha trabajado con el enfoque Database First, ahora aprenderá a obtener los mismos resultados con un proceso diferente. Se han marcado las tareas que se encuentran en común con el ejercicio 1, para facilitar la lectura. Si no ha completado el ejercicio 1, pero desea aprender el enfoque Code First, puede empezar desde este ejercicio y obtener una cobertura completa del tema.

Tarea 1: Rellenar datos de ejemplo

En esta tarea, rellenará la base de datos con datos de ejemplo cuando se cree inicialmente mediante Code-First.

  1. Abra la solución Begin ubicada en la carpeta Source/Ex2-CreatingADatabaseCodeFirst/Begin/. De lo contrario, puede seguir utilizando la solución Final obtenida al completar el ejercicio anterior.

    1. Si abrió la solución Begin proporcionada, deberá descargar algunos paquetes NuGet que faltan antes de continuar. Para ello, haga clic en el menú Proyecto y seleccione Administrar paquetes NuGet.

    2. En el cuadro de diálogo Administrar paquetes NuGet, haga clic en Restaurar para descargar los paquetes que faltan.

    3. Por último, para compilar la solución, haga clic en Compilar | Compilar solución.

      Nota:

      Una de las ventajas de usar NuGet es que no es necesario enviar todas las bibliotecas del proyecto, lo que reduce el tamaño del proyecto. Con NuGet Power Tools, especificando las versiones del paquete en el archivo Packages.config, podrá descargar todas las bibliotecas necesarias la primera vez que ejecute el proyecto. Este es el motivo por el que tendrá que ejecutar estos pasos después de abrir una solución existente desde este laboratorio.

  2. Agregue el archivo SampleData.cs a la carpeta Models. Para ello, haga clic con el botón derecho en la carpeta Models, seleccione Agregar y, a continuación, haga clic en Elemento existente. Vaya a \Source\Assets y seleccione el archivo SampleData.cs.

    Sample data populate code

    Código de relleno de datos de ejemplo

  3. Abra el archivo Global.asax.cs y agregue lo siguientes instrucciones using.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Instrucciones using de Global Asax)

    using MvcMusicStore.Models;
    using System.Data.Entity;
    
  4. En el método Application_Start() agregue la línea siguiente para establecer el inicializador de base de datos.

    (Fragmento de código: Modelos y acceso a datos: Ex2 SetInitializer de Global Asax)

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    
        Database.SetInitializer(new SampleData());
    }
    

Tarea 2: Configuración de la conexión a la base de datos

Ahora que ya ha agregado una base de datos a nuestro proyecto, escribirá en el archivo Web.config la cadena de conexión.

  1. Agregue una cadena de conexión en Web.config. Para ello, abra Web.config en la raíz del proyecto y reemplace la cadena de conexión denominada DefaultConnection por esta línea en la sección <connectionStrings>:

    Web.config file location

    Ubicación del archivo Web.config

    <configuration>
    ...
      <connectionStrings>
        <add name="MusicStoreEntities" connectionString="data source=(LocalDb)\v11.0;initial catalog=MvcMusicStore;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\MvcMusicStore.mdf" providerName="System.Data.SqlClient" />
      </connectionStrings>
    ...
    

Tarea 3: Trabajar con el modelo

Ahora que ya ha configurado la conexión a la base de datos, vinculará el modelo con las tablas de base de datos. En esta tarea, creará una clase que se vinculará a la base de datos con Code First. Recuerde que hay una clase de modelo POCO existente que se debe modificar.

Nota:

Si completó el ejercicio 1, observará que este paso lo realizó un asistente. Al realizar Code First, creará manualmente clases que se vincularán a entidades de datos.

  1. Abra la clase de modelo POCO Genre desde la carpeta de proyecto Models e incluya un identificador. Utilice una propiedad int con el nombre GenreId.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Genre de Code First)

    namespace MvcMusicStore.Models
    {
        using System.Collections.Generic;
    
        public class Genre
        {
          public int GenreId { get; set; }
    
          public string Name { get; set; }
    
          public string Description { get; set; }
    
          public List<Album> Albums { get; set; }
        }
    }
    

    Nota:

    Para trabajar con convenciones de Code First, la clase Genre debe tener una propiedad de clave principal que se detectará automáticamente.

    Puede obtener más información sobre las convenciones de Code First en este artículo de MSDN.

  2. Ahora, abra la clase de modelo POCO Album desde la carpeta de proyecto Models e incluya las claves externas, cree propiedades con los nombres GenreId y ArtistId. Esta clase ya tiene GenreId para la clave principal.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Album de Code First)

    namespace MvcMusicStore.Models
    {
        public class Album
        {
            public int AlbumId { get; set; }
    
            public int GenreId { get; set; }
    
            public int ArtistId { get; set; }
    
            public string Title { get; set; }
    
            public decimal Price { get; set; }
    
            public string AlbumArtUrl { get; set; }
    
            public virtual Genre Genre { get; set; }
    
            public virtual Artist Artist { get; set; }
        }
    }
    
  3. Abra la clase de modelo POCO Artist e incluya la propiedad ArtistId.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Artist de Code First)

    namespace MvcMusicStore.Models
    {
        public class Artist
        {
            public int ArtistId { get; set; }
    
            public string Name { get; set; }
        }
    }
    
  4. Haga clic con el botón derecho en la carpeta de proyecto Models y seleccione Agregar | Clase. Asigne al archivo el nombre MusicStoreEntities.cs. A continuación, haga clic en Agregar.

    Adding a class

    Agregar un nuevo elemento

    Adding a class2

    Agregar una clase

  5. Abra la clase que acaba de crear, MusicStoreEntities.cs, e incluya los espacios de nombres System.Data.Entity y System.Data.Entity.Infrastructure.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    ...
    
  6. Reemplace la declaración de clase para extender la clase DbContext: declare un DBSet público e invalide el método OnModelCreating. Después de este paso, obtendrá una clase de dominio que vinculará el modelo con Entity Framework. Para ello, reemplace el código de clase por lo siguiente:

    (Fragmento de código: Modelos y acceso a datos: Ex2 MusicStoreEntities de Code First)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    namespace MvcMusicStore.Models
    {
        public class MusicStoreEntities : DbContext
        {
            public DbSet<Genre> Genres { get; set; }
    
            public DbSet<Album> Albums { get; set; }
    
            public DbSet<Artist> Artists { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Genre>().ToTable("Genres");
                modelBuilder.Entity<Album>().ToTable("Albums");
                modelBuilder.Entity<Artist>().ToTable("Artists");
    
                base.OnModelCreating(modelBuilder);
            }
        }
    }
    

Nota:

Con DbContext y DBSet de Entity Framework podrá consultar la clase de POCO Genre. Al extender el método OnModelCreating, se especifica en el código cómo se asignará Genre a una tabla de base de datos. Puede encontrar más información sobre DBContext y DBSet en este artículo de MSDN: vínculo

Tarea 4: Consultar la base de datos

En esta tarea, actualizará la clase StoreController para que, en lugar de usar datos codificados de forma rígida, los recupere de la base de datos.

Nota:

Esta tarea es común con el ejercicio 1.

Si completó el ejercicio 1, observará que estos pasos son los mismos en ambos enfoques (Database First o Code First). Son diferentes en la forma en que los datos están vinculados con el modelo, pero el acceso a las entidades de datos aún es transparente desde el controlador.

  1. Abra Controllers\StoreController.cs y agregue el siguiente campo a la clase para contener una instancia de la clase MusicStoreEntities, denominada storeDB:

    (Fragmento de código: Modelos y acceso a datos: Ex1 storeDB)

    public class StoreController : Controller
    {
        private MusicStoreEntities storeDB = new MusicStoreEntities();
        ...
    }
    
  2. La clase MusicStoreEntities expone una propiedad de colección para cada tabla de la base de datos. Actualice el método de acción Browse para recuperar un género con todos los Álbumes.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Store Browse)

    public ActionResult Browse(string genre)
    {
         // Retrieve Genre and its Associated Albums from database
         var genreModel = new Genre
        {
            Name = genre,
            Albums = this.storeDB.Albums.ToList()
        };
    
         return this.View(genreModel);
    }
    

    Nota:

    Está usando una funcionalidad de .NET denominada LINQ (consulta integrada en lenguaje) para escribir expresiones de consulta fuertemente tipadas en estas colecciones, que ejecutarán código en la base de datos y devolverán objetos en los que puede programar.

    Para obtener más información sobre LINQ, visite el sitio de MSDN.

  3. Actualice el método de acción Index para recuperar todos los géneros.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Store Index)

    public ActionResult Index()
    {
        var genres = this.storeDB.Genres;
    
        return this.View(genres);
    }
    
  4. Actualice el método de acción Index para recuperar todos los géneros y transformar la colección en una lista.

    (Fragmento de código: Modelos y acceso a datos: Ex2 Store GenreMenu)

    // GET: /Store/GenreMenu
    [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = this.storeDB.Genres.Take(9).ToList();
    
        return this.PartialView(genres);
    }
    

Tarea 5: Ejecución de la aplicación

En esta tarea, comprobará que la página Índice del almacén mostrará ahora los géneros almacenados en la base de datos, en lugar de los codificados de forma rígida. No es necesario cambiar la plantilla View porque StoreController devuelve el mismo StoreIndexViewModel que antes, pero esta vez los datos provendrán de la base de datos.

  1. Vuelva a compilar la solución y presione F5 para ejecutar la aplicación.

  2. El proyecto se inicia en la página Principal. Compruebe que el menú de Géneros ya no es una lista codificada de forma rígida y que los datos se recuperan directamente de la base de datos.

    Screenshot shows a music genre page where you can verify that the Genres menu is retrieved from the database.

    Exploración de géneros desde la base de datos

  3. Ahora vaya a cualquier género y compruebe que los álbumes se rellenan desde la base de datos.

    Screenshot shows a view where you verify that the albums are populated from the database.

    Exploración de álbumes desde la base de datos

Ejercicio 3: Consulta de la base de datos con parámetros

En este ejercicio, aprenderá a consultar la base de datos mediante parámetros y a usar la forma de resultados de la consulta, una característica que reduce el número de accesos a la base de datos recuperando datos de una manera más eficaz.

Nota:

Para obtener más información sobre el modelado de resultados de la consulta, visite el siguiente artículo de MSDN.

Tarea 1: Modificar StoreController para recuperar álbumes de la base de datos

En esta tarea, cambiará la clase StoreController para acceder a la base de datos para recuperar álbumes de un género específico.

  1. Abra la solución Begin ubicada en la carpeta Source\Ex3-QueryingTheDatabaseWithParametersCodeFirst\Begin si desea usar el enfoque Code-First o Source\Ex3-QueryingTheDatabaseWithParametersDBFirst\Begin si desea usar el enfoque Database-First. De lo contrario, puede seguir utilizando la solución Final obtenida al completar el ejercicio anterior.

    1. Si abrió la solución Begin proporcionada, deberá descargar algunos paquetes NuGet que faltan antes de continuar. Para ello, haga clic en el menú Proyecto y seleccione Administrar paquetes NuGet.

    2. En el cuadro de diálogo Administrar paquetes NuGet, haga clic en Restaurar para descargar los paquetes que faltan.

    3. Por último, para compilar la solución, haga clic en Compilar | Compilar solución.

      Nota:

      Una de las ventajas de usar NuGet es que no es necesario enviar todas las bibliotecas del proyecto, lo que reduce el tamaño del proyecto. Con NuGet Power Tools, especificando las versiones del paquete en el archivo Packages.config, podrá descargar todas las bibliotecas necesarias la primera vez que ejecute el proyecto. Este es el motivo por el que tendrá que ejecutar estos pasos después de abrir una solución existente desde este laboratorio.

  2. Abra la clase StoreController para cambiar el método de acción Browse. Para ello, en el Explorador de soluciones, expanda la carpeta Controllers y haga doble clic en StoreController.cs.

  3. Cambie el método de acción Browse para recuperar álbumes para un género específico. Para ello, reemplace el código siguiente:

    (Fragmento de código: Modelos y acceso a datos: Ex3 StoreController BrowseMethod)

    public ActionResult Browse(string genre)
    {
        // Retrieve Genre and its Associated Albums from database
        var genreModel = this.storeDB.Genres.Include("Albums")
            .Single(g => g.Name == genre);
    
        return this.View(genreModel);
    }
    

Nota:

Para rellenar una colección de la entidad, debe usar el método Include para especificar que también desea recuperar los álbumes. Puede usar la extensión .Single() en LINQ porque en este caso solo se espera un género para un álbum. El método Single() toma una expresión Lambda como parámetro, que en este caso especifica un único objeto Genre de forma que su nombre coincida con el valor definido.

Aprovechará una característica que le permite indicar otras entidades relacionadas que desee cargar, así como cuándo se recupera el objeto Genre. Esta característica se denomina Forma de resultados de consulta y nos permite reducir el número de veces necesarias para acceder a la base de datos para recuperar información. En este escenario, querrá capturar previamente los álbumes del género que recupere.

La consulta incluye Genres.Include("Albums") para indicar que también quiere álbumes relacionados. Esto dará lugar a una aplicación más eficaz, ya que recuperará los datos de género y álbum en una sola solicitud de base de datos.

Tarea 2: Ejecución de la aplicación

En esta tarea, ejecutará la aplicación y recuperará álbumes de un género específico de la base de datos.

  1. Presione F5 para ejecutar la aplicación.

  2. El proyecto se inicia en la página Principal. Cambie la dirección URL a /Store/Browse?genre=Pop para comprobar que los resultados se recuperan de la base de datos.

    Browsing by genre

    Examinar /Store/Browse?genre=Pop

Tarea 3: Acceso a álbumes por identificador

En esta tarea, repetirá el procedimiento anterior para obtener álbumes por su identificador.

  1. Cierre el explorador si es necesario, para volver a Visual Studio. Abra la clase StoreController para cambiar el método de acción Details. Para ello, en el Explorador de soluciones, expanda la carpeta Controllers y haga doble clic en StoreController.cs.

  2. Cambie el método de acción Details para recuperar los detalles de los álbumes en función de su identificador. Para ello, reemplace el código siguiente:

    (Fragmento de código: Modelos y acceso a datos: Ex3 StoreController DetailsMethod)

    // GET: /Store/
    public ActionResult Details(int id)
    {
        var album = this.storeDB.Albums.Find(id);
    
        if (album == null)
        {
            return this.HttpNotFound();
        }
    
        return this.View(album);
    }
    

Tarea 4: Ejecución de la aplicación

En esta tarea, ejecutará la aplicación en un explorador web y obtendrá los detalles del álbum por su identificador.

  1. Presione F5 para ejecutar la aplicación.

  2. El proyecto se inicia en la página Principal. Cambie la dirección URL a /Store/Details/51 o busque los géneros y seleccione un álbum para comprobar que los resultados se recuperan de la base de datos.

    Browsing Details

    Examinar /Store/Details/51

Nota:

Además, puede implementar esta aplicación en sitios web de Windows Azure si sigue Apéndice B: Publicación de una aplicación ASP.NET MVC 4 mediante Web Deploy.


Resumen

Al completar este laboratorio práctico, ha aprendido los aspectos básicos de modelos y acceso a datos de ASP.NET MVC, mediante el enfoque Database First, así como el enfoque Code First:

  • Cómo agregar una base de datos a la solución para consumir sus datos
  • Procedimiento para actualizar controladores para proporcionar plantillas de vista con los datos tomados de la base de datos en lugar de codificar de forma rígida uno
  • Cómo consultar la base de datos mediante parámetros
  • Cómo usar el modelado de resultados de la consulta, una característica que reduce el número de accesos a la base de datos, recuperando datos de una manera más eficaz
  • Uso de enfoques de Database First y Code First en Microsoft Entity Framework para vincular la base de datos con el modelo

Apéndice A: Instalación de Visual Studio Express 2012 para Web

Puede instalar Microsoft Visual Studio Express 2012 para Web u otra versión "Express" mediante el Instalador de plataforma web de Microsoft . Las instrucciones siguientes le guían por los pasos necesarios para instalar Visual Studio Express 2012 para Web mediante Instalador de plataforma web de Microsoft.

  1. Vaya a [https://go.microsoft.com/?linkid=9810169](https://go.microsoft.com/?linkid=9810169). Como alternativa, si ya ha instalado el Instalador de plataforma web, puede abrirlo y buscar el producto "Visual Studio Express 2012 for Web con Windows Azure SDK".

  2. Haga clic en Instalar ahora. Si no tiene Instalador de plataforma web se le redirigirá para descargarlo e instalarlo primero.

  3. Una vez que Instalador de plataforma web está abierto, haga clic en Instalar para iniciar la instalación.

    Install Visual Studio Express

    Instalar Visual Studio Express

  4. Lea todas las licencias y términos de los productos y haga clic en Acepto para continuar.

    Accepting the license terms

    Aceptar los términos de licencia

  5. Espere hasta que finalice el proceso de descarga e instalación.

    Installation progress

    Progreso de la instalación

  6. Cuando finalice la instalación, haga clic en Finalizar.

    Installation completed

    Instalación completada

  7. Haga clic en Salir para cerrar el Instalador de plataforma web.

  8. Para abrir Visual Studio Express para Web, vaya a la pantalla Inicio y empiece a escribir "VS Express", haga clic en el icono de VS Express para Web.

    VS Express for Web tile

    Icono de VS Express para Web

Apéndice B: Publicación de una aplicación de ASP.NET MVC 4 mediante Web Deploy

En este apéndice se muestra cómo crear un sitio web desde el portal de administración de Windows Azure y publicar la aplicación que ha obtenido al seguir el laboratorio, y aprovechar la característica de publicación Web Deploy proporcionada por Windows Azure.

Tarea 1: Creación de un sitio web desde el portal de Windows Azure

  1. Vaya al Portal de administración de Windows Azure e inicie sesión con las credenciales de Microsoft asociadas a la suscripción.

    Nota:

    Con Windows Azure puede hospedar 10 sitios web de ASP.NET de forma gratuita y, después, escalar a medida que crezca el tráfico. Puede registrarse aquí.

    Log on to Windows Azure portal

    Inicio de sesión en el Portal de administración de Windows Azure

  2. Haga clic en Nuevo en la barra de comandos.

    Creating a new Web Site

    Crear un nuevo sitio web

  3. Haga clic en Proceso | Sitio web. A continuación, seleccione opción Creación rápida. Proporcione una dirección URL disponible para el nuevo sitio web y haga clic en Crear sitio web.

    Nota:

    Un sitio web de Windows Azure es el host para una aplicación web que se ejecuta en la nube que puede controlar y administrar. La opción Creación rápida permite implementar una aplicación web completada en el sitio web de Windows Azure desde fuera del portal. No incluye pasos para configurar una base de datos.

    Creating a new Web Site using Quick Create

    Crear un nuevo sitio web mediante la creación rápida

  4. Espere hasta que se cree el nuevo Sitio web.

  5. Una vez creado el sitio web, haga clic en el vínculo de la columna dirección URL. Compruebe que el nuevo sitio web funciona.

    Browsing to the new web site

    Exploración a la nueva aplicación web

    Web site running

    Sitio web en ejecución

  6. Volver al portal y haga clic en el nombre del sitio web en la columna Nombre para mostrar las páginas de administración.

    Opening the web site management pages

    Abrir las páginas de administración del sitio web

  7. En la página Panel, en la sección de vista rápida, haga clic en el vínculo Descargar perfil de publicación.

    Nota:

    El perfil de publicación contiene toda la información necesaria para publicar una aplicación web en un sitio web de Windows Azure para cada método de publicación habilitado. El perfil de publicación contiene las direcciones URL, las credenciales de usuario y las cadenas de base de datos necesarias para conectarse y autenticarse en cada uno de los puntos de conexión para los que está habilitado un método de publicación. Microsoft WebMatrix 2, Microsoft Visual Studio Express para Web y Microsoft Visual Studio 2012 admiten la lectura de perfiles de publicación para automatizar la configuración de estos programas para publicar aplicaciones web en sitios web de Windows Azure.

    Downloading the web site publish profile

    Descargar el perfil de publicación del sitio web

  8. Descargue el archivo de perfil de publicación en una ubicación conocida. Más adelante en este ejercicio verá cómo usar este archivo para publicar una aplicación web en un sitio web de Windows Azure desde Visual Studio.

    Saving the publish profile file

    Guardar el archivo de perfil de publicación

Tarea 2: Configuración del servidor de bases de datos

Si la aplicación usa bases de datos de SQL Server, deberá crear un servidor de SQL Database. Si desea implementar una aplicación sencilla que no use SQL Server, puede omitir esta tarea.

  1. Necesitará un servidor de SQL Database para almacenar la base de datos de la aplicación. Puede ver los servidores de SQL Database desde la suscripción en el Portal de administración de Windows Azure en Sql Databases | Servers | Server's Dashboard. Si no tiene un servidor creado, puede crear uno mediante el botón Agregar de la barra de comandos. Tome nota del nombre y la dirección URL del servidor , el nombre de inicio de sesión de administrador y la contraseña, ya que los usará en las tareas siguientes. Aún no cree la base de datos, ya que se creará en una fase posterior.

    SQL Database Server Dashboard

    Panel de SQL Database Server

  2. En la siguiente tarea probará la conexión de base de datos desde Visual Studio, por ese motivo debe incluir la dirección IP local en la lista de Direcciones IP permitidas. Para ello, haga clic en Configurar, seleccione la dirección IP de dirección IP del cliente actual y péguela en el Dirección IP de inicio y cuadros de texto Dirección IP final y haga clic en el botón add-client-ip-address-ok-button.

    Adding Client IP Address

    Adición de la dirección IP del cliente

  3. Una vez agregada la Dirección IP del cliente a la lista de direcciones IP permitidas, haga clic en Guardar para confirmar los cambios.

    Confirm Changes

    Confirmar cambios

Tarea 3: Publicación de una aplicación de ASP.NET MVC 4 mediante Web Deploy

  1. Vuelva a la solución ASP.NET MVC 4. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto de sitio web y seleccione Publicar.

    Publishing the Application

    Publicación del sitio web

  2. Importe el perfil de publicación que guardó en la primera tarea.

    Importing the publish profile

    Importación del perfil de publicación

  3. Haga clic en Validar conexión. Una vez completada la validación, haga clic en Siguiente.

    Nota:

    La validación se completa una vez que aparezca una marca de verificación verde junto al botón Validar conexión.

    Validating connection

    Validar conexión

  4. En la página Configuración, en la sección Bases de datos, haga clic en el botón situado junto al cuadro de texto de la conexión de base de datos (es decir, DefaultConnection).

    Web deploy configuration

    Configuración de Web Deploy

  5. Configure la conexión de base de datos de la siguiente manera:

    • En Nombre del servidor, escriba la dirección URL del servidor SQL Database con el prefijo tcp:.

    • En nombre de usuario escriba el nombre de inicio de sesión del administrador del servidor.

    • En Contraseña escriba la contraseña de inicio de sesión del administrador del servidor.

    • Escriba un nuevo nombre de base de datos.

      Configuring destination connection string

      Configuración de la cadena de conexión de destino

  6. A continuación, haga clic en Aceptar. Cuando se le pida que cree la base de datos, haga clic en .

    Creating the database

    Creación de la base de datos

  7. La cadena de conexión que utilizará para conectarse a la Base de datos SQL en Windows Azure se muestra en el cuadro de texto Conexión predeterminada. A continuación, haga clic en Siguiente.

    Connection string pointing to SQL Database

    Cadena de conexión que apunta a SQL Database

  8. En la página Versión preliminar, haga clic en Publicar.

    Publishing the web application

    Publicación de la aplicación web

  9. Una vez finalizado el proceso de publicación, el explorador predeterminado abrirá el sitio web publicado.

Apéndice C: Uso de fragmentos de código

Con fragmentos de código, tiene todo el código que necesita a su alcance. El documento de laboratorio le indicará exactamente cuándo puede usarlos, como se muestra en la ilustración siguiente.

Using Visual Studio code snippets to insert code into your project

Usar fragmentos de código de Visual Studio para insertar código en el proyecto

Para agregar un fragmento de código mediante el teclado (solo C#)

  1. Coloque el cursor donde desea insertar el código.
  2. Empiece a escribir el nombre del fragmento de código (sin espacios o guiones).
  3. Vea como IntelliSense muestra los nombres de los fragmentos de código coincidentes.
  4. Seleccione el fragmento de código correcto (o siga escribiendo hasta que se seleccione el nombre completo del fragmento de código).
  5. Presione la tecla Tab dos veces para insertar el fragmento de código en la ubicación del cursor.

Start typing the snippet name

Empezar a escribir el nombre del fragmento de código

Press Tab to select the highlighted snippet

Presione la tecla Tab para seleccionar el fragmento de código resaltado

Press Tab again and the snippet will expand

Presione la pestaña de nuevo y el fragmento de código se expandirá

Para agregar un fragmento de código mediante el mouse (C#, Visual Basic y XML) 1. Haga clic con el botón derecho en el lugar donde desea insertar el fragmento de código.

  1. Seleccione Insertar fragmento de código seguido de Mis fragmentos de código.
  2. Seleccione el fragmento de código correspondiente de la lista haciendo clic en él.

Right-click where you want to insert the code snippet and select Insert Snippet

Haga clic con el botón derecho en el lugar donde desea insertar el fragmento de código y seleccione Insertar fragmento de código

Pick the relevant snippet from the list, by clicking on it

Seleccionar el fragmento de código correspondiente de la lista, haciendo clic en él