Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
por Microsoft
El objetivo de este tutorial es explicar un método de creación de clases de modelo para una aplicación MVC de ASP.NET. En este tutorial, aprenderá a crear clases de modelo y a realizar el acceso a la base de datos aprovechando Microsoft LINQ to SQL.
El objetivo de este tutorial es explicar un método de creación de clases de modelo para una aplicación MVC de ASP.NET. En este tutorial, aprenderá a crear clases de modelo y a realizar el acceso a la base de datos aprovechando Microsoft LINQ to SQL.
En este tutorial, creamos una aplicación básica de base de datos Movie. Comenzamos creando la aplicación movie database de la manera más rápida y sencilla posible. Realizamos el acceso a todos los datos directamente desde las acciones de nuestro controlador.
A continuación, aprenderá a usar el patrón Repositorio. El uso del patrón Repository requiere un poco más de trabajo. Sin embargo, la ventaja de adoptar este patrón es que permite compilar aplicaciones adaptables para cambiar y que se pueden probar fácilmente.
¿Qué es una clase de modelo?
Un modelo MVC contiene toda la lógica de la aplicación que no está contenida en una vista MVC o un controlador MVC. En concreto, un modelo de MVC contiene toda la lógica de acceso a datos y negocio de la aplicación.
Puede usar una variedad de tecnologías diferentes para implementar la lógica de acceso a datos. Por ejemplo, puede crear las clases de acceso a datos mediante las clases Microsoft Entity Framework, NHibernate, Subsonic o ADO.NET.
En este tutorial, uso LINQ to SQL para consultar y actualizar la base de datos. LINQ to SQL proporciona un método muy fácil de interactuar con una base de datos de Microsoft SQL Server. Sin embargo, es importante comprender que el marco de ASP.NET MVC no está vinculado a LINQ to SQL de ninguna manera. ASP.NET MVC es compatible con cualquier tecnología de acceso a datos.
Crear una base de datos de películas
En este tutorial, para ilustrar cómo puede crear clases de modelo, creamos una sencilla aplicación de base de datos Movie. El primer paso es crear una nueva base de datos. Haga clic con el botón derecho en la carpeta App_Data de la ventana del Explorador de soluciones y seleccione la opción de menú Agregar, Nuevo elemento. Seleccione la plantilla Base de datos de SQL Server , asígnele el nombre MoviesDB.mdf y haga clic en el botón Agregar (vea la figura 1).
Figura 01: Agregar una nueva base de datos de SQL Server (haga clic para ver la imagen de tamaño completo)
Después de crear la nueva base de datos, puede abrir la base de datos haciendo doble clic en el archivo MoviesDB.mdf de la carpeta App_Data. Al hacer doble clic en el archivo MoviesDB.mdf, se abre la ventana Explorador de servidores (vea la figura 2).
La ventana Explorador de servidores se denomina ventana Explorador de bases de datos cuando se usa Visual Web Developer.
Figura 02: Usar la ventana Explorador de servidores (haga clic para ver la imagen de tamaño completo)
Necesitamos agregar una tabla a nuestra base de datos que represente nuestras películas. Haga clic con el botón derecho en la carpeta Tablas y seleccione la opción de menú Agregar nueva tabla. Al seleccionar esta opción de menú se abre el Diseñador de tablas (vea la figura 3).
Figura 03: Diseñador de tablas (haga clic para ver la imagen de tamaño completo)
Es necesario agregar las columnas siguientes a la tabla de base de datos:
| Nombre de la columna | Tipo de dato | Permitir valores NULL |
|---|---|---|
| Id | Int | Falso |
| Título | Nvarchar(200) | Falso |
| Director | Nvarchar(50) | Falso |
Debe hacer dos cosas especiales en la columna Id. En primer lugar, debe marcar la columna Id como una columna de clave principal seleccionando la columna en el Diseñador de tablas y haciendo clic en el icono de una clave. LINQ to SQL requiere especificar las columnas de clave principal al realizar inserciones o actualizaciones en la base de datos.
A continuación, debe marcar la columna Id como una columna Identity mediante la asignación del valor Sí a la propiedad Is Identity (vea la figura 3). Una columna Identity es una columna a la que se asigna un nuevo número automáticamente cada vez que se agrega una nueva fila de datos a una tabla.
Creación de clases LINQ to SQL
Nuestro modelo MVC contendrá clases LINQ to SQL que representan la tabla de base de datos tblMovie. La manera más fácil de crear estas clases LINQ to SQL es hacer clic con el botón derecho en la carpeta Modelos, seleccionar Agregar, Nuevo elemento, seleccionar la plantilla LinQ to SQL Classes, asignar el nombre Movie.dbml a las clases y hacer clic en el botón Agregar (vea la figura 4).
Figura 04: Crear clases LINQ to SQL (haga clic para ver la imagen de tamaño completo)
Inmediatamente después de crear las clases MOVIE LINQ to SQL, aparece el Diseñador relacional de objetos. Puede arrastrar tablas de base de datos desde la ventana Explorador de servidores al Diseñador relacional de objetos para crear clases LINQ to SQL que representen tablas de base de datos concretas. Es necesario agregar la tabla de base de datos tblMovie al Diseñador relacional de objetos (vea la figura 5).
Figura 05: Usar el Diseñador relacional de objetos (haga clic para ver la imagen de tamaño completo)
De forma predeterminada, el Diseñador relacional de objetos crea una clase con el mismo nombre que la tabla de base de datos que se arrastra al Diseñador. Sin embargo, no queremos nombrar nuestra clase tblMovie. Por lo tanto, haga clic en el nombre de la clase en el Diseñador y cambie el nombre de la clase a Movie.
Por último, recuerde hacer clic en el botón Guardar (la imagen del disquete) para guardar las clases LINQ to SQL. De lo contrario, el Diseñador relacional de objetos no generará las clases LINQ to SQL.
Uso de LINQ to SQL en una acción del controlador
Ahora que tenemos nuestras clases LINQ to SQL, podemos usar estas clases para recuperar datos de la base de datos. En esta sección, aprenderá a usar las clases LINQ to SQL directamente dentro de una acción del controlador. Mostraremos la lista de películas de la tabla de base de datos tblMovies en una vista MVC.
En primer lugar, es necesario modificar la clase HomeController. Esta clase se puede encontrar en la carpeta Controllers de la aplicación. Modifique la clase para que tenga el aspecto de la clase en la lista 1.
Lista 1 : Controllers\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
var dataContext = new MovieDataContext();
var movies = from m in dataContext.Movies
select m;
return View(movies);
}
}
}
La Index() acción de la lista 1 usa una clase LINQ to SQL DataContext () MovieDataContextpara representar la MoviesDB base de datos. El Diseñador relacional de objetos de Visual Studio generó la MoveDataContext clase .
Una consulta LINQ se realiza en DataContext para recuperar todas las películas de la tblMovies tabla de base de datos. La lista de películas se asigna a una variable local denominada movies. Por último, la lista de películas se pasa a la vista a través de los datos de vista.
Para mostrar las películas, debemos modificar la vista Índice. Puede encontrar la vista Índice en la Views\Home\ carpeta . Actualice la vista Índice para que tenga el aspecto de la vista en el Listado 2.
Lista 2 : Views\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<% foreach (Movie m in (IEnumerable)ViewData.Model)
{ %>
<li> <%= m.Title %> </li>
<% } %>
</ul>
</asp:Content>
Observe que la vista Índice modificada incluye una <%@ import namespace %> directiva en la parte superior de la vista. Esta directiva importa MvcApplication1.Models namespace. Necesitamos este espacio de nombres para trabajar con las model clases ( en particular, la Movie clase ) en la vista .
La vista en la Lista 2 contiene un foreach bucle que recorre todos los elementos representados por la ViewData.Model propiedad. El valor de la Title propiedad se muestra para cada movie.
Observe que el valor de la ViewData.Model propiedad se convierte en .IEnumerable Esto es necesario para recorrer en bucle el contenido de ViewData.Model. Otra opción aquí es crear un objeto fuertemente tipado view. Cuando se crea un objeto fuertemente tipado view, se convierte la ViewData.Model propiedad en un tipo determinado en la clase de código subyacente de una vista.
Si ejecuta la aplicación después de modificar la HomeController clase y la vista Índice, obtendrá una página en blanco. Obtendrá una página en blanco porque no hay registros de películas en la tblMovies tabla de base de datos.
Para agregar registros a la tblMovies tabla de base de datos, haga clic con el botón derecho en la tblMovies tabla de base de datos en la ventana Explorador de servidores (ventana Explorador de bases de datos en Visual Web Developer) y seleccione la opción de menú Mostrar datos de tabla. Puede insertar movie registros mediante la cuadrícula que aparece (vea la figura 6).
Figura 06: Insertar películas(Haga clic para ver la imagen de tamaño completo)
Después de agregar algunos registros de base de datos a la tblMovies tabla y ejecutar la aplicación, verá la página en la figura 7. Todos los registros de la base de datos de películas se muestran en una lista con viñetas.
Figura 07: Mostrar películas con la vista Índice(Haga clic para ver la imagen de tamaño completo)
Uso del patrón de repositorio
En la sección anterior, usamos las clases LINQ to SQL directamente dentro de una acción del controlador. Hemos usado la MovieDataContext clase directamente desde la acción del Index() controlador. No hay nada malo al hacer esto en el caso de una aplicación simple. Sin embargo, trabajar directamente con LINQ to SQL en una clase de controlador crea problemas cuando necesita compilar una aplicación más compleja.
El uso de LINQ to SQL dentro de una clase de controlador dificulta el cambio de tecnologías de acceso a datos en el futuro. Por ejemplo, puede decidir cambiar de usar Microsoft LINQ to SQL a usar Microsoft Entity Framework como tecnología de acceso a datos. En ese caso, necesitaría reescribir todos los controladores que acceden a la base de datos dentro de su aplicación.
El uso de LINQ to SQL dentro de una clase de controlador también dificulta la compilación de pruebas unitarias para la aplicación. Normalmente, no desea interactuar con una base de datos al realizar pruebas unitarias. Quiere usar las pruebas unitarias para probar la lógica de la aplicación y no el servidor de bases de datos.
Para compilar una aplicación de MVC que sea más adaptable al cambio futuro y que se pueda probar más fácilmente, debe considerar el uso del patrón Repositorio. Al usar el patrón Repository, se crea una clase de repositorio independiente que contiene toda la lógica de acceso a la base de datos.
Al crear la clase de repositorio, se crea una interfaz que representa todos los métodos utilizados por la clase de repositorio. Dentro de los controladores, escriba su código contra la interfaz en lugar del repositorio. De este modo, puede implementar el repositorio mediante diferentes tecnologías de acceso a datos en el futuro.
La interfaz de La lista 3 se denomina IMovieRepository y representa un único método denominado ListAll().
Lista 3 : Models\IMovieRepository.cs
using System.Collections.Generic;
namespace MvcApplication1.Models
{
public interface IMovieRepository
{
IList<Movie> ListAll();
}
}
La clase de repositorio en el Listado 4 implementa la interfaz IMovieRepository. Observe que contiene un método denominado ListAll() que corresponde al método requerido por la IMovieRepository interfaz.
Lista 4 : Models\MovieRepository.cs
using System.Collections.Generic;
using System.Linq;
namespace MvcApplication1.Models
{
public class MovieRepository : IMovieRepository
{
private MovieDataContext _dataContext;
public MovieRepository()
{
_dataContext = new MovieDataContext();
}
#region IMovieRepository Members
public IList<Movie> ListAll()
{
var movies = from m in _dataContext.Movies
select m;
return movies.ToList();
}
#endregion
}
}
Por último, la MoviesController clase de La lista 5 usa el patrón Repository. Ya no usa las clases LINQ to SQL directamente.
Lista 5: Controllers\MoviesController.cs
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class MoviesController : Controller
{
private IMovieRepository _repository;
public MoviesController() : this(new MovieRepository())
{
}
public MoviesController(IMovieRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
return View(_repository.ListAll());
}
}
}
Observe que la MoviesController clase de La lista 5 tiene dos constructores. Se llama al primer constructor, el constructor sin parámetros, cuando se ejecuta la aplicación. Este constructor crea una instancia de la MovieRepository clase y la pasa al segundo constructor.
El segundo constructor tiene un único parámetro: un IMovieRepository parámetro . Este constructor simplemente asigna el valor del parámetro a un campo de nivel de clase denominado _repository.
La MoviesController clase aprovecha un patrón de diseño de software denominado patrón de inserción de dependencias. En concreto, se está utilizando algo llamado Inyección de Dependencias del Constructor. Para obtener más información sobre este patrón, lea el siguiente artículo de Martin Fowler:
http://martinfowler.com/articles/injection.html
Observe que todo el código de la MoviesController clase (con la excepción del primer constructor) interactúa con la IMovieRepository interfaz en lugar de la clase real MovieRepository . El código interactúa con una interfaz abstracta en lugar de una implementación concreta de la interfaz.
Si desea modificar la tecnología de acceso a datos usada por la aplicación, simplemente puede implementar la IMovieRepository interfaz con una clase que use la tecnología alternativa de acceso a bases de datos. Por ejemplo, podría crear una EntityFrameworkMovieRepository clase o una SubSonicMovieRepository clase. Dado que la clase de controlador está programada en la interfaz, puede pasar una nueva implementación de IMovieRepository a la clase de controlador y la clase seguiría funcionando.
Además, si desea probar la clase MoviesController, puede pasar una clase de repositorio de películas falsa a la HomeController. Puede implementar la IMovieRepository clase con una clase que realmente no tiene acceso a la base de datos, sino que contiene todos los métodos necesarios de la IMovieRepository interfaz. De este modo, puede probar unitariamente la MoviesController clase sin tener acceso a una base de datos real.
Resumen
El objetivo de este tutorial era demostrar cómo puede crear clases de modelo de MVC aprovechando Microsoft LINQ to SQL. Hemos examinado dos estrategias para mostrar datos de base de datos en una aplicación ASP.NET MVC. En primer lugar, creamos clases LINQ to SQL y usamos las clases directamente dentro de una acción del controlador. El uso de clases LINQ to SQL dentro de un controlador le permite mostrar datos de base de datos de forma rápida y sencilla en una aplicación MVC.
A continuación, hemos explorado una ruta de acceso ligeramente más difícil, pero definitivamente más virtuosa para mostrar los datos de la base de datos. Aprovechamos el patrón Repository y colocamos toda la lógica de acceso a la base de datos en una clase de repositorio independiente. En nuestro controlador, hemos escrito todo nuestro código en una interfaz en lugar de una clase concreta. La ventaja del patrón Repository es que nos permite cambiar fácilmente las tecnologías de acceso a bases de datos en el futuro y nos permite probar fácilmente nuestras clases de controlador.