Compartir a través de


Crear clases de modelo con Entity Framework (VB)

por Microsoft

En este tutorial, aprenderá a usar ASP.NET MVC con Microsoft Entity Framework. Aprenderá a usar el Asistente para entidades para crear una instancia de Entity Data Model de ADO.NET. A lo largo de este tutorial, crearemos una aplicación web que ilustre cómo seleccionar, insertar, actualizar y eliminar datos de base de datos mediante Entity Framework.

El objetivo de este tutorial es explicar cómo puede crear clases de acceso a datos mediante Microsoft Entity Framework al compilar una aplicación ASP.NET MVC. En este tutorial se da por hecho que no existe un conocimiento previo de Microsoft Entity Framework. Al final de este tutorial, comprenderá cómo usar Entity Framework para seleccionar, insertar, actualizar y eliminar registros de base de datos.

Microsoft Entity Framework es una herramienta de asignación relacional de objetos (O/RM) que permite generar automáticamente una capa de acceso a datos desde una base de datos. Entity Framework elimina el trabajo tedioso de crear las clases de acceso a datos a mano.

Nota:

No hay ninguna conexión esencial entre ASP.NET MVC y Microsoft Entity Framework. Hay varias alternativas a Entity Framework que puede usar con ASP.NET MVC. Por ejemplo, puede compilar las clases de modelo de MVC mediante otras herramientas de O/RM, como Microsoft LINQ to SQL, NHibernate o SubSonic.

Para ilustrar cómo puede usar Microsoft Entity Framework con ASP.NET MVC, crearemos una aplicación de ejemplo sencilla. Crearemos una aplicación de Base de datos de películas para mostrar y editar registros de base de datos de películas.

En este tutorial se supone que tiene Visual Studio 2008 o Visual Web Developer 2008 con Service Pack 1. Necesita Service Pack 1 para usar Entity Framework. Puede descargar Visual Studio 2008 Service Pack 1 o Visual Web Developer con Service Pack 1 desde la siguiente dirección:

https://www.asp.net/downloads/

Creación de la base de datos de películas de ejemplo

La aplicación de Base de datos de películas usa una tabla de base de datos denominada Movies que contiene las columnas siguientes:

Nombre de la columna Tipo de datos ¿Permitir valores null? ¿Es clave principal?
Identificador int False True
Título nvarchar(100) False False
Director nvarchar(100) False False

Puede agregar esta tabla a un proyecto de ASP.NET MVC siguiendo estos pasos:

  1. Haga clic con el botón derecho en la carpeta App_Data de la ventana Explorador de soluciones y seleccione la opción de menú Agregar, Nuevo elemento.
  2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Base de datos SQL Server, asigne a la base de datos el nombre MoviesDB.mdf y haga clic en el botón Agregar.
  3. Haga doble clic en el archivo MoviesDB.mdf para abrir la ventana Explorador de servidores o Explorador de bases de datos.
  4. Expanda la conexión de base de datos MoviesDB.mdf, haga clic con el botón derecho en la carpeta Tables y seleccione la opción de menú Agregar nueva tabla.
  5. En el Diseñador de tablas, agregue las columnas Id, Title y Director.
  6. Haga clic en el botón Guardar (tiene el icono de disquete) para guardar la nueva tabla con el nombre Movies.

Después de crear la tabla de base de datos Películas, debe agregar algunos datos de ejemplo a la tabla. Haga clic con el botón derecho en la tabla Movies y seleccione la opción de menú Mostrar datos de tabla. Puede escribir datos falsos de películas en la cuadrícula que aparece.

Creación de la instancia de Entity Data Model de ADO.NET

Para usar Entity Framework, debe crear una instancia de Entity Data Model. Puede usar el Asistente para Entity Data Model de Visual Studio para generar una instancia de Entity Data Model a partir de una base de datos automáticamente.

Siga estos pasos:

  1. Haga clic con el botón derecho en la carpeta Models de la ventana Explorador de soluciones y seleccione la opción de menú Agregar, Nuevo elemento.
  2. En el cuadro de diálogo Agregar nuevo elemento, seleccione la categoría Datos (vea la figura 1).
  3. Seleccione la plantilla Entity Data Model de ADO.NET, asigne a la instancia de Entity Data Model el nombre MoviesDBModel.edmx y haga clic en el botón Agregar. Al hacer clic en el botón Agregar, se inicia el Asistente para modelos de datos.
  4. En el paso Elegir contenido del modelo, elija la opción Generar desde una base de datos y haga clic en el botón Siguiente (vea la figura 2).
  5. En el paso Elegir la conexión de datos, seleccione la conexión de base de datos MoviesDB.mdf, escriba el nombre de la configuración de conexión de entidades MoviesDBEntities y haga clic en el botón Siguiente (vea la figura 3).
  6. En el paso Elegir los objetos de base de datos, seleccione la tabla de base de datos Movies y haga clic en el botón Finalizar (vea la figura 4).

Después de completar estos pasos, se abre el Diseñador de Entity Data Model de ADO.NET (Entity Designer).

Figura 1: Creación de una nueva instancia de Entity Data Model

clip_image002

Figura 2: Paso Elegir contenido del modelo

clip_image004

Figura 3: Elección de la conexión de datos

clip_image006

Figura 4: Elección de los objetos de base de datos

clip_image008

Modificación de la instancia de Entity Data Model de ADO.NET

Después de crear una instancia de Entity Data Model, puede modificar el modelo con Entity Designer (vea la figura 5). Puede abrir Entity Designer en cualquier momento haciendo doble clic en el archivo MoviesDBModel.edmx incluido en la carpeta Models dentro de la ventana del Explorador de soluciones.

Figura 5: Diseñador de Entity Data Model de ADO.NET

clip_image010

Por ejemplo, puede usar Entity Designer para cambiar los nombres de las clases que genera el Asistente para Entity Data Model. El Asistente creó una nueva clase de acceso a datos denominada Movies. En otras palabras, el Asistente dio a la clase el mismo nombre que el de la tabla de base de datos. Dado que usaremos esta clase para representar una instancia determinada de Movie, deberíamos cambiar el nombre de la clase de Movies a Movie.

Si quiere cambiar el nombre de una clase de entidad, puede hacer doble clic en el nombre de clase en Entity Designer y escribir un nombre nuevo (vea la figura 6). Como alternativa, puede cambiar el nombre de una entidad en el ventana Propiedades después de seleccionar una entidad en Entity Designer.

Figura 6: Cambio de un nombre de entidad

clip_image012

Recuerde guardar su instancia de Entity Data Model después de realizar una modificación haciendo clic en el botón Guardar (el icono de disquete). En segundo plano, el Diseñador de entidades genera un conjunto de clases de Visual Basic .NET. Puede ver estas clases abriendo el archivo MoviesDBModel.Designer.vb desde la ventana del Explorador de soluciones.

No modifique el código del archivo Designer.vb, ya que los cambios se sobrescribirán la próxima vez que use Entity Designer. Si desea ampliar la funcionalidad de las clases de entidad definidas en el archivo Designer.vb, puede crear clases parciales en distintos archivos.

Selección de registros de base de datos con Entity Framework

Para comenzar, vamos a crear nuestra aplicación Base de datos de películas mediante la creación de una página que muestre una lista de registros de películas. El controlador Home de la lista 1 expone una acción denominada Index(). La acción Index() devuelve todos los registros de película de la tabla de base de datos Movie usando Entity Framework.

Lista 1: Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

Observe que el controlador de la lista 1 incluye un constructor. El constructor inicializa un campo de nivel de clase denominado _db. El campo _db representa las entidades de base de datos generadas por Microsoft Entity Framework. El campo _db es una instancia de la clase MoviesDBEntities generada por Entity Designer.

El campo _db se usa dentro de la acción Index() para recuperar los registros de la tabla de base de datos Películas. La expresión _db.MovieSet representa todos los registros de la tabla de base de datos Películas. El método ToList() se usa para convertir el conjunto de películas en una colección genérica de objetos Movie: List( Of Movie).

Los registros de películas se recuperan con la ayuda de LINQ to Entities. La acción Index() de la lista 1 usa la sintaxis del método de LINQ para recuperar el conjunto de registros de base de datos. Si lo prefiere, puede usar la sintaxis de consulta de LINQ en su lugar. Las dos instrucciones siguientes hacen lo mismo:

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

Use la sintaxis de LINQ (sintaxis de método o sintaxis de consulta) que encuentre más intuitiva. No hay ninguna diferencia en el rendimiento entre los dos enfoques, la única diferencia es el estilo.

La vista de la lista 2 se usa para mostrar los registros de películas.

Lista 2: Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

La vista de la lista 2 contiene un bucle For Each que recorre en iteración cada registro de película y muestra los valores de las propiedades Title y Director del registro de películas. Observe que se muestra un vínculo Editar y eliminar junto a cada registro. Además, aparece un vínculo Agregar película en la parte inferior de la vista (vea la figura 7).

Figura 7: La vista Index

clip_image014

La vista Index es una vista con tipo. La vista Index tiene una directiva <%@ Page %> que incluye un atributo Inherits. El atributo Inherits convierte la propiedad ViewData.Model en una colección de listas genéricas fuertemente tipadas de objetos Movie: List(Of Movie).

Inserción de registros de base de datos con Entity Framework

Puede usar Entity Framework para facilitar la inserción de nuevos registros en una tabla de base de datos. La lista 3 contiene dos nuevas acciones agregadas al controlador Home que puede usar para insertar nuevos registros en la tabla de base de datos Película.

Lista 3: Controllers\HomeController.vb (métodos Add)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

La primera acción Agregar() simplemente devuelve una vista. La vista contiene un formulario para agregar un nuevo registro de base de datos de películas (vea la figura 8). Al enviar el formulario, se invoca la segunda acción Add().

Observe que la segunda acción Add() está decorada con el atributo AcceptVerbs. Esta acción solo se puede invocar al realizar una operación HTTP POST. En otras palabras, esta acción solo se puede invocar al publicar un formulario HTML.

La segunda acción Add() crea una nueva instancia de la clase Movie de Entity Framework con la ayuda del método TryUpdateModel() de ASP.NET MVC. El método TryUpdateModel() toma los campos del elemento FormCollection pasado al método Add() y asigna los valores de estos campos de formulario HTML a la clase Movie.

Al usar Entity Framework, debe proporcionar una "lista segura" de propiedades cuando se emplean los métodos TryUpdateModel o UpdateModel para actualizar las propiedades de una clase de entidad.

A continuación, la acción Add() realiza alguna validación de formulario simple. La acción comprueba que las propiedades Title y Director tienen valores. Si se produce un error de validación, se agrega un mensaje de error de validación a ModelState.

Si no hay errores de validación, se agrega un nuevo registro de película a la tabla de base de datos Movies con la ayuda de Entity Framework. El nuevo registro se agrega a la base de datos con las dos líneas de código siguientes:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

La primera línea de código agrega la nueva entidad Movie al conjunto de películas de las que Entity Framework realiza el seguimiento. La segunda línea de código guarda en la base de datos subyacente los cambios que se hayan realizado en las películas objeto de seguimiento.

Figura 8: La vista Add

clip_image016

Actualización de registros de base de datos con Entity Framework

Puede seguir casi el mismo enfoque para editar un registro de base de datos con Entity Framework como el enfoque que acabamos de seguir para insertar un nuevo registro de base de datos. La lista 4 contiene dos nuevas acciones de controlador denominadas Edit(). La primera acción Edit() devuelve un formulario HTML para editar un registro de película. La segunda acción Edit() intenta actualizar la base de datos.

Lista 4: Controllers\HomeController.vb (métodos Edit)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

La segunda acción Edit() comienza recuperando el registro Movie de la base de datos que coincide con el identificador de la película que se está editando. La siguiente instrucción LINQ to Entities toma el primer registro de base de datos que coincide con un identificador determinado:

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

A continuación, se usa el método TryUpdateModel() para asignar los valores de los campos de formulario HTML a las propiedades de la entidad movie. Observe que se proporciona una lista segura para especificar las propiedades exactas que se van a actualizar.

A continuación, se realiza una validación sencilla para comprobar que las propiedades Movie Title y Director tienen valores. Si alguna propiedad no tiene un valor, se agrega un mensaje de error de validación a ModelState y ModelState.IsValid devuelve el valor false.

Por último, si no hay errores de validación, la tabla de base de datos Movies subyacente se actualiza con los cambios llamando al método SaveChanges().

Al editar registros de base de datos, debe pasar el identificador del registro que se está editando a la acción del controlador que realiza la actualización de la base de datos. De lo contrario, la acción del controlador no sabrá qué registro actualizar en la base de datos subyacente. La vista Edit, contenida en la lista 5, incluye un campo de formulario oculto que representa el identificador del registro de base de datos que se está editando.

Lista 5: Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Eliminación de registros de base de datos con Entity Framework

La operación final de la base de datos, que necesitamos abordar en este tutorial, consiste en eliminar registros de base de datos. Puede usar la acción del controlador en la lista 6 para eliminar un registro de base de datos determinado.

Lista 6: Controllers\HomeController.vb (acción Delete)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

La acción Delete() recupera primero la entidad Movie que coincide con el Id pasado a la acción. A continuación, la película se elimina de la base de datos mediante la llamada al método DeleteObject() seguido del método SaveChanges(). Por último, se redirige al usuario de vuelta a la vista Index.

Resumen

El propósito de este tutorial era demostrar cómo puede crear aplicaciones web controladas por bases de datos aprovechando las ventajas de ASP.NET MVC y Microsoft Entity Framework. Ha aprendido a compilar una aplicación que le permite seleccionar, insertar, actualizar y eliminar registros de base de datos.

Primero, se ha explicado cómo puede usar el Asistente de Entity Data Model para generar una instancia de Entity Data Model desde Visual Studio. A continuación, ha aprendido a usar LINQ to Entities para recuperar un conjunto de registros de base de datos de una tabla de base de datos. Por último, se ha usado Entity Framework para insertar, actualizar y eliminar registros de base de datos.