Hola a todos, después de tanto tiempo vuelvo a publicar un articulo. Les pido disculpas pero he estado ocupado en un proyecto en el cual utilizo MVC como patrón de desarrollo.
En esta oportunidad vamos a realizar un proyecto MVC y crearemos nuestro Modelo a partir de un Entity Data Model.
Paso 1 – Crear un Proyecto MVC
El primer paso consiste en crear un proyecto MVC, tal y como hemos visto en artículos anteriores.
Paso 2 – Agregar un Entity Data Model
Un Entity Data Model es una herramienta de .NET que tiene como objetivo crear todas las clases necesarias para interactuar con el Modelo de Datos. Se realiza una sincronización con el motor de Base de Datos y se generan entidades dentro del proyecto .NET. Si quieres profundizar acerca del tema puede mirar este link http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx.
En fin, para agregar este componente al proyecto nos dirigimos a agregar un nuevo ítem como lo muestra la pantalla siguiente:
Cabe aclarar que se debe añadir el componente dentro de la carpeta Models del Proyecto MVC. (simplemente por una cuestión de concepto)
Al agregar el componente ADO.NET, se nos presenta la opción de sincronizar con una Base de Datos o crear un Modelo vacío. En nuestro caso lo sincronizaremos con una Base de Datos alojada en un servidor SQL Server.
En la siguiente instancia debemos elegir la conexión a la Base de Datos. Al setear estas propiedades se agregaran las configuraciones necesarias de forma automática en el web.config de nuestro proyecto (me refiero a connectionStrings y demás configuraciones).
A continuación se nos presenta la opción de escoger los objetos de la Base de Datos a utilizar en el Modelo. En nuestro ejemplo añadimos la tabla Book únicamente. Recomiendo seleccionar ambas opciones acerca de la forma de dibujar los objetos en el modelo. La primera de ellas pluriza/singuliza los nombres de las tablas, esto será para un trabajo más ordenado y limpio con listas. La segunda opción incluirá las claves para relacionar las tablas en el modelo.
Nota: Tener en cuenta el espacio de nombres que se le asignará para instanciarlo al momento de utilizar el contexto.
Si tenemos éxito al añadir el componente, veremos que en el proyecto se han añadido dos archivos. El primero de ellos, “BookModel.edmx”, muestra una vista de diseño del Modelo, mientras que el segundo, “BookModel.Designer.cs”, posee las clases con sus constructores, propiedades y métodos para administrar el Modelo.
Paso 3 – Seleccionando Registros de la Base de Datos
Luego de añadir el componente, procederemos a utilizarlo. Para ello utilizaremos el controlador y la acción por defecto (“HomeController” e “Index”, respectivamente). El código que deberíamos implementar en nuestro controlador sería similar al siguiente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using EntityFrameworkTest.Models;
namespace EntityFrameworkTest.Controllers {
public class HomeController : Controller {
//
// GET: /Home/
SampleMVCEntities _context;
public HomeController() {
_context = new SampleMVCEntities();
}
public ActionResult Index() {
IList<Book> libros = _context.Books.ToList();
return View(libros);
}
}
}
Como puede observarse, es tan sencillo como instanciar una clase y utilizar sus métodos y atributos para manejar el contexto. En nuestro caso hemos instanciado la clase SampleMVCEntities en el constructor del controlador y posteriormente lo utilizamos en la acción Index para obtener una lista de libros.
Nota: no olvidarse de referenciar la librería del modelo.
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IList<Book>>" %>
<%@ Import Namespace="EntityFrameworkTest.Models" %>
<!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>
<link rel="Stylesheet" href="../../Content/Site.css" />
</head>
<body>
<div class="view-book">
<% foreach (Book item in Model) {%>
Id: <%:item.Id %>
<br />
Author: <%:item.Author %>
<br />
Title: <%:item.Title %>
<br />
Publisher: <%:item.Publisher %>
<br />
Year: <%:item.Year %>
<br />
<%= Html.ActionLink("Edit","Edit", new {id = item.Id}) %>
<%= Html.ActionLink("Delete","Delete",new {id=item.Id}) %>
<hr />
<% } %>
<%= Html.ActionLink("New","Insert") %>
</div>
</body>
</html>
Nota: al final de la vista se han creado link que referencian a acciones que explayaré en los siguientes pasos.
Paso 4 – Creando un nuevo registro
Para crear un nuevo registro en la tabla Book de nuestra base de datos de ejemplo, utilizaremos dos acciones y una sola vista. Las acciones a implementar se detallan a continuación:
public ActionResult Insert() {
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Insert(FormCollection form) {
Book libro = new Book();
TryUpdateModel(libro, new string[] { "Id","Author", "Title", "Publisher", "Year" }, form.ToValueProvider());
if (string.IsNullOrEmpty(libro.Author)) ModelState.AddModelError("Author", "Author is required");
if (string.IsNullOrEmpty(libro.Title)) ModelState.AddModelError("Title", "Title is required");
if (string.IsNullOrEmpty(libro.Publisher)) ModelState.AddModelError("Publisher", "Publisher is required");
if (!libro.Year.HasValue) ModelState.AddModelError("Year", "Year is required");
if (ModelState.IsValid) {
_context.AddToBook(libro);
_context.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);
return RedirectToAction("Index");
}
return View(libro);
}
La primera acción se ejecutará la primera vez, cuando el usuario efectúe un click en el link “Insert” ubicado en nuestra vista principal “Index.aspx”. La segunda acción, sobrecargada, se disparará cuando se realice un submit del formulario correspondiente a la vista “Insert.aspx”, es decir cuando acepte ingresar un libro. Esto puede realizarse debido a que en la segunda acción le hemos indicado que se ejecutará cuando el método sea un post. Nota además que el parámetro de dicha acción es del tipo FormCollection, que no es otra cosa que un diccionario con los valores del formulario enviado por post.
Las primeras líneas son para crear un libro a partir del FormCollection y validar que los campos posean valores. Entonces, una vez que se ha validado el modelo, se procede a añadir un libro a nuestro contexto y actualizar los cambios.
Además, el método SaveChanges posee una sobrecarga, una de ellas es la que he elegido para el ejemplo. Se pasa como parámetro una opción que determinará la manera de actualizar los cambios. En este caso se verifica si se han realizado cambios en el contexto, y si así fuere, se actualiza.
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Book>" %>
<%@ Import Namespace="EntityFrameworkTest.Models" %>
<!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>Insert</title>
</head>
<body>
<div>
<form method="post" action="/Home/Insert">
Author: <%:Html.TextBox("Author") %>
<br />
Title: <%:Html.TextBox("Title")%>
<br />
Publisher: <%:Html.TextBox("Publisher")%>
<br />
Year: <%:Html.TextBox("Year")%>
<br />
<input type="submit" value="Acept Book" />
</form>
</div>
</body>
</html>
Paso 5 – Editando Registros
Para la funcionalidad de editar registros, el código y el procedimiento es muy similar a la inserción. Se implementan dos acciones y una vista parecidos al paso anterior:
public ActionResult Edit(long id) {
Book libro = _context.Book.FirstOrDefault(b => b.Id == id);
ViewData.Model = libro;
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form) {
int id = Int32.Parse(form["Id"]);
Book libro = _context.Book.FirstOrDefault(b => b.Id == id);
TryUpdateModel(libro, new string[] {"Id","Author","Title","Publisher","Year" }, form.ToValueProvider());
if (string.IsNullOrEmpty(libro.Author)) ModelState.AddModelError("Author", "Author is required");
if (string.IsNullOrEmpty(libro.Title)) ModelState.AddModelError("Title", "Title is required");
if (string.IsNullOrEmpty(libro.Publisher)) ModelState.AddModelError("Publisher", "Publisher is required");
if (!libro.Year.HasValue) ModelState.AddModelError("Year", "Year is required");
if (ModelState.IsValid) {
_context.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);
return RedirectToAction("Index");
}
return View();
}
En la segunda acción, primero se busca el objeto en el contexto y luego se actualiza el mismo con los datos del formulario recibido por post. Luego se realiza la misma comprobación de valores no nulos ni vacios. Por último, si el modelo es válido, se actualiza el contexto.
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Book>" %>
<%@ Import Namespace="EntityFrameworkTest.Models" %>
<!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>Edit</title>
</head>
<body>
<div>
<form method="post" action="/Home/Edit">
Id: <%:Html.Hidden("Id") %>
Author: <%:Html.TextBox("Author") %>
<br />
Title: <%:Html.TextBox("Title")%>
<br />
Publisher: <%:Html.TextBox("Publisher")%>
<br />
Year: <%:Html.TextBox("Year")%>
<br />
<input type="submit" value="Update Book" />
</form>
</div>
</body>
</html>
Otra diferencia se encuentra en la vista de la edición, debido a que debe añadirse el Id de un libro como un valor oculto del formulario, ya que de otra manera no lograremos identificar el libro que se encuentra en edición (al momento de realizar la acción).
Paso 6 – Eliminando Registros
Por último, la funcionalidad más sencilla de todas, vemos como eliminar un registro del modelo y de la base de datos. Tengo que aclarar que habrá que tener mucho cuidado en el manejo del contexto y especialmente al momento de aceptar los cambios (método SaveChanges()) debido a que todos los cambios realizados impactan directamente en nuestra base de datos. Pero claro con un correcto y cuidadoso manejo del contexto no habrá de que preocuparse. A continuación detallo la acción para eliminar registros:
public ActionResult Delete(long id) {
Book libro = _context.Book.FirstOrDefault(b=>b.Id==id);
_context.Book.DeleteObject(libro);
_context.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);
return RedirectToAction("Index");
}
La acción recibe como parámetro el identificador del libro a eliminar, lo identifica en el contexto y luego lo elimina del mismo. Por último se guardan los cambios y se redirecciona a nuestra pantalla principal. Esta funcionalidad no requiere una vista debido a que se realiza la llama a la acción desde la vista principal, y como resultado redireccionamos a la misma vista.
Espero que este artículo haya sido útil y puedan continuar aprendiendo junto a mí. Saludos.
Referencia: creating-model-classes-with-the-entity-framework-cs








