MegaTutorial(part 3) How to: ASP.NET MVC 2

Despues de un tiempo de ausencia vuelvo aqui con estos tutoriales de MVC, esta es la tercera parte, si no has visitado las anteriores, te recomiendo que lo hagas! Parte 1. Bueno comencemos con la tercera parte, lo que veremos ahora es acceder a una base de datos, la base de datos es esta la puedes bajar de aqui, bueno comencemos!.

Models y Data Access.

Hasta el momento, lo que hemos estado haciendo es solo transmitir cadenas de direcciones URL que van a nuestro  accion controlador (Action Controller) y la manda a nuestra vista. Esa es una buena manera de sentar las bases, pero ahora estamos listos para conectarnos a una base de datos. Empezaremos añadiendo un directorio App_Data que es un directorio especial en ASP.NET que ya cuenta con los permisos de seguridad necesarios para el acceso a base de datos.

Dando click derecho en el projecto y seleccionamos Add | Add ASP.NET Folder | App_Data.


Ahora agregaremos nuestra base de datos. El archivo de la base de datos se llama MvcMusicStore.mdf que es el que ya les deje arriba para que lo descarguen. Dando click derecho en la carpeta App_Data, seleccionamos Add | Existing Item… y buscamos el archivo que han descargado «MvcMusicStore.mdf».

Ahora ya agregamos la base de datos al proyecto, vamos a necesitar crear codigo para leer y escribir en la base de datos. Usaremos Entity Framework data model para manejar eso. Haga click  en la carpeta Models y seleccionamos  Add | New Item | Data | ADO.NET Entity Data Model. Lo nombraremos como StoreDB.edmx y presionamos Add.

Luego nos saldra un Wizard que nos ira preguntando como queremos generar nuestro modelo desde la base de datos o si creamos uno  vacio. Seleccionamos «Generate from database» y le damos Next.

Ya que estamos generando nuestro modelo de una base de datos, tendremos que espeficificar que base de datos vamos a utilizar. El asistente es lo suficientemente inteligente para ver que tenemos una base de datos en nuestra carpeta App_Data, por lo que rellena la informacion de la conexion correcta para esa base de datos para nosotros.

Seleccionamos Tables y revisamos que este seleccionado «Include foreign key columns in the model». Cambiamos el nombre «Model Namespace» y le ponemos MvcMusicStore.

Enseguida nos mostrara el diagrama entidad relacion de nuestra base de datos.

Ahora que tenemos un modelo de datos reales en su lugar, podemos borrar el disco y las clases de Genero que agregamos en la carpeta Model clases con las que hemos estado trabajando, entonces borraremos  Album.cs y Genre.cs de la carpeta Models.

A pesar de haber borrado las clases Album y Genres, el proyecto aun se construye y las paginas aun funcionan,

Por que?

Desde nuestra base de datos las tablas tienen campos que incluyen todas las propiedades que  se estaban usando en nuestras clases Album y Genre, nuestro modelo de datos las reemplazo.

Si bien la muestra del diseñador de Entity Framework las entidades del diagrama, en realidad son solo clases de C#. Expanda el nodo StoreDB.edmx en el explorador de soluciones, y veras un archivo llamado StoreDB.Designer.cs

Para demostrar eso, vamos a cambiar el nombre de la clase de MvcMusicStoreEntities a MusicStoreEntities( hara nuestro codigo mas bonito). Haga click en el nombre de la clase (MvcMusicStoreEntities) y seleccione Refactor | Rename.

Cambie el nombre de la clase a MusicStoreEntities y presione Apply.

Consultando la base de datos.

Ahora cambiemos nuestro controlador llamado Store, empezaremos instanciando nuestra base de datos al inicio de nuestro controlador Store.

public class StoreController : Controller
{
    MusicStoreEntities storeDB = new MusicStoreEntities();

Store Index usando LINQ Query Expression.
La clase MusicStoreEntities expone una coleccion para cada tabla en nuestra base de datos, asi que podemos consultar nuestra tabla de Genre usando LINQ ( consulta integrada de lenguaje).
Primero vamos a actualizar nuestra pagina indice (Index) de la tienda para leer todos los nombres de Genero en nuestra base de datos, y lo haremos de la siguiente manera:

//
// GET: /Store/

public ActionResult Index()
{
    // Devuelve una lista de generos de nuestra DB
    var genres = from genre in storeDB.Genres
                    select genre.Name;

    // Establecemos el modelo
    var viewModel = new StoreIndexViewModel()
    {
        Genres = genres.ToList(),
        NumberOfGenres = genres.Count()
    };

    // Devuelve la vista
    return View(viewModel);
}

No es necesario hacer cambios a nuestra vista, por que esta haciendo lo mismo que estabamos haciendo antes, mostrar un listado de generos.

Store Browse, Details, e Index usando una LINQ Extension Method.
Para la busqueda de la tienda, vamos a demostrar una alternativa a la sintaxis de las expresiones LINQ que acabamos de ver- LINQ Extension Method.Estos hacen lo mismo, asi que usted puede utilizar cualquier sintaxis que mejor le paresca para una consulta determinada.

En este Action Controller, estamos en busca de un genero por su nombre. Nosotros solo esperamos un resultado, ya que no siempre debe tener dos entradas para el nombre del mismo genero, por lo que usaremos el metodo de extension unico en el genero, de esta manera:

var genre = storeDB.Genres.Single(g => g.Name == "Disco");

El metodo toma una expresion lambda como parametro, que especifica que queremos un genero unico de tal manera que su nombre coincide con el valor que hemos definido.

Vamos a aprovechar una caracteristica de Entity Framework que nos permite especificar otras entidades relacionadas que queremos cargar, asi, llama hacer un resultado de la consulta. Queremos cargar los Albums para el Genero que estan en venta, asi que consultamos desde Genres.Include(«Albums») para indicar que queremos los albums relacionados. Esto es mas eficiente, ya que tanto recuperar nuestro genero y los datos del disco en una solicitud unica.

//
// GET: /Store/Browse?Genre=Disco

public ActionResult Browse(string genre)
{
      // Retrieve Genre from database
      var genreModel = storeDB.Genres.Include("Albums")
         .Single(g => g.Name == genre);

      var viewModel = new StoreBrowseViewModel()
      {
         Genre = genreModel,
         Albums = genreModel.Albums.ToList()
      };

      return View(viewModel);
}

Corriendo la aplicacion y si buscamos /Store/Browse?genre=Jazz, nos mostrata los siguientes resultados

Ahora haremos un cambio a Store Details, reemplazandolo de la siguiente manera

//
// GET: /Store/Details/5
public ActionResult Details(int id)
{
var album = storeDB.Albums.Single(a => a.AlbumId == id);
return View(album);
}

Y asi terminamos la tercera parte que fue llamada «Models and Data Access».

Bookmark and Share

Autor: Isaac Ojeda

Computer Systems Engineer. Full stack DotNet developer. Expert in Web technologies, and lifelong learner in all existing technologies for software development.

17 opiniones en “MegaTutorial(part 3) How to: ASP.NET MVC 2”

  1. ke tal
    tu blog esta de pelos =)
    oie nada ke ver con los temas peroo
    io tengo ubuntu gracias a un amigo super buena onda
    ke si leeiera esto kisiera ke supiera ke se akopla bn shido
    bueno mi pregunta es como hago para deskargar musika si tengo ubuntu

    si estaba acostumbrado a usar ares
    pero ke puedo hacer ahora??

    gracias por tu atencion =))

    1. no rene :

      ke tal
      tu blog esta de pelos =)
      oie nada ke ver con los temas peroo
      io tengo ubuntu gracias a un amigo super buena onda
      ke si leeiera esto kisiera ke supiera ke se akopla bn shido
      bueno mi pregunta es como hago para deskargar musika si tengo ubuntu

      si estaba acostumbrado a usar ares
      pero ke puedo hacer ahora??

      gracias por tu atencion =))

      JAJAJA mugre rene, usa taringa para bajar musica

  2. Holap, hago el codigo del browse tal como lo tienes, y me marca el siguiente error:
    The method ‘Single’ is not supported by LINQ to Entities. Consider using the method ‘First’ instead
    es porque tengo el visual 2008?
    te agradeceria me apoyaras con eso…. un saludo.. muy buen blog

    1. Si tienes todo tal cual esta aqui!, talvez sea por que VS 2008 no lo tienes con MVC 2, o si? no te has fijado en eso, por que no se a que se debe ese error. Podrias intentar en vez de usar una expresion lambda usar una LINQ normal como esta en index
      Saludos

    1. Hola y de nada :).

      Tengo todo el tutorial en ingles, por si gustas puedo mandartelo!, esta muy bien explicado y por si no le entiendes tiene muchas imagenes y se da a entender!, si lo quieres te lo mando 🙂

  3. Hola carnal estuvo chido este tutorial lo que kiero saber es cuando sacaras la cuarta parte por que la neta estoy aprendiendo un buen contigo soy novato y pues me quede emocionado con ver la siguiente parte si ya esta podrias mandarmela please para seguir con este chingon tutorial muchas gracias y de antemano te mando un cordial saludo XDD

Replica a Tinker Cancelar la respuesta