Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio...

14
Nhibernate y ASP .NET MVC Bueno en esta ocasión me toca hablar de un buen ejemplo que encontré en otro Blog de inglés (forerunnerg34) , que lo estudie y puedo compartir con ustedes, entonces lo haremos por pasos, pronto les mostrare el video. 1. Crear la base de datos en Sql Server llamado Blog con los siguiente campos: En cuanto a los Id pongan porfavor uniqueidentifier 2. Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog

Transcript of Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio...

Page 1: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

Nhibernate y ASP .NET MVC

Bueno en esta ocasión me toca hablar de un buen ejemplo que encontré en otro Blog de inglés (forerunnerg34) , que lo estudie y puedo compartir con ustedes, entonces lo haremos por pasos, pronto les mostrare el video.

1. Crear la base de datos en Sql Server llamado Blog con los siguiente campos:

En cuanto a los Id pongan porfavor uniqueidentifier

2. Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog

Agregar nuevo proyecto y escoger dos bibliotecas de clases, la primera se llamara Core y crear folders en ella y la segunda Infrastructure y crear folders como muestra la figura

Page 2: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

En la primera biblioteca de clase Core fuera de las carpetas agregamos una interfaz llamada IRepository con el siguiente código.

namespace Core{ public interface IRepository<T> { void Save(T entity); void Update(T entity); void Delete(T entiy); T GetById(Guid id); IList<T> GetAll(); }}

Ahora vamos a crear los modelos en la carpeta model la clase Category con el siguiente código

namespace Core.Domain.Model{ public class Category { public virtual Guid Id { get; set; }

Page 3: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

public virtual string Name { get; set; } }}

Y la clase Post con el siguiente código

namespace Core.Domain.Model{ public class Post { public Post() { Categories = new List<Category>(); } public virtual Guid Id { get; set; } public virtual string Title { get; set; } public virtual string Body { get; set; } public virtual DateTime CreationDate { get; set; } public virtual bool IsPublic { get; set; }

public virtual IList<Category> Categories { get; set; } }}

Ahora creamos los repositorios, empecemos creando la sesiones.

Agregamos una clase llamada NHibernateHelper con el siguiente código

namespace Core.Domain.Repositories{ public class NHibernateHelper { private static ISessionFactory _sessionFactory;

private static ISessionFactory SessionFactory { get { if (_sessionFactory == null) { var configuration = new Configuration(); configuration.Configure(); _sessionFactory = configuration.BuildSessionFactory(); } return _sessionFactory; } }

public static ISession OpenSession() { return SessionFactory.OpenSession();

Page 4: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

} }}

Ahora vamos a crear el repositorio CategoryRepository en la carpeta Repositories, no olviden hacer referencia en NHibernate y NHibernate.cfg y para esto necesitamos solo el archivo NHibernate.dll

using Core.Domain.Model;using NHibernate;using NHibernate.Criterion;

namespace Core.Domain.Repositories{ public class CategoryRepository: IRepository<Category> { #region IRepository<Category> Members

void IRepository<Category>.Save(Category entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Save(entity); transaction.Commit(); } } }

void IRepository<Category>.Update(Category entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Update(entity); transaction.Commit(); } } }

void IRepository<Category>.Delete(Category entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Delete(entity); transaction.Commit(); } } }

Category IRepository<Category>.GetById(Guid id)

Page 5: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

{ using (ISession session = NHibernateHelper.OpenSession()) return session.CreateCriteria<Category>().Add(Restrictions.Eq("Id", id)).UniqueResult<Category>(); }

IList<Category> IRepository<Category>.GetAll() { using (ISession session = NHibernateHelper.OpenSession()) { ICriteria criteria = session.CreateCriteria(typeof(Category)); return criteria.List<Category>(); } }

#endregion }}

Ahora creamos PostRepository y agregamos los siguiente

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Core.Domain.Model;using NHibernate;using NHibernate.Criterion;

namespace Core.Domain.Repositories{ public class PostRepository: IRepository<Post> { #region IRepository<Post> Members

void IRepository<Post>.Save(Post entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Save(entity); transaction.Commit(); } } }

void IRepository<Post>.Update(Post entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Update(entity); transaction.Commit(); } }

Page 6: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

}

void IRepository<Post>.Delete(Post entity) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Delete(entity); transaction.Commit(); } } }

Post IRepository<Post>.GetById(Guid id) { using (ISession session = NHibernateHelper.OpenSession()) return session.CreateCriteria<Post>().Add(Restrictions.Eq("Id", id)).UniqueResult<Post>(); }

IList<Post> IRepository<Post>.GetAll() { using (ISession session = NHibernateHelper.OpenSession()) { ICriteria criteria = session.CreateCriteria(typeof(Post)); return criteria.List<Post>(); } }

#endregion }}

Listo ahora nos vamos a la capa de persistencia que solo hay que mapear nuestras clases

En la biblioteca de clases Infrastructure en la carpeta Mappings creamos un archivo xml llamado Category.hbm.xml y colocamos lo siguiente

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

namespace="Core.Domain.Model"assembly="Core">

<class name="Category" table="Categories" dynamic-update="true"> <cache usage="read-write"/> <id name="Id" column="Id" type="Guid"> <generator class="guid"/> </id> <property name="Name" length="100"/> </class>

Page 7: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

</hibernate-mapping>

También agregamos otro archivo xml llamado Post.hbm.xml

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

namespace="Core.Domain.Model"assembly="Core">

<class name="Post" table="Posts" dynamic-update="true"> <cache usage="read-write"/> <id name="Id" column="Id" type="Guid"> <generator class="guid"/> </id> <property name="Title" length="100"/> <property name="Body"/> <property name="CreationDate" type="datetime" update="false"/> <property name="IsPublic" type="bool"/>

<bag name="Categories" table="PostCategory" lazy="false" > <key column="idPost" ></key> <many-to-many class="Category" column="idCategory" ></many-to-many> </bag> </class></hibernate-mapping>

Por ultimo fuera de la carpeta Mappings colocamos un archivo de configuración llamado hibernate.cfg.xml y ponemos lo siguiente

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.connection_string">server=.\SQLExpress;database=NHibernate101;Integrated Security=true;</property> <property name="show_sql">true</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <property name="cache.use_query_cache">false</property> <property name="adonet.batch_size">100</property> <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> <mapping assembly="Infrastructure" /> </session-factory></hibernate-configuration>

No olviden que en las propiedades de cada archivo colocamos

Page 8: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

Perfecto nuestra capa de persistencia está resuelto, aquí hacemos referencia a todo los demás archivos de NHibernate como Castle.Core y otros.

3. Ahora vamos a trabajar con nuestro proyecto MVC para ver si todo está funcionando correctamente.Vamos a empezar creando nuestros modelos en la carpeta model creamos una clase llamada PostCategory y colocamos el siguiente código

using Core.Domain.Model;

Page 9: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

namespace NHibernate101.Models{ public class PostCategory { public PostCategory() { }

public PostCategory(Category category, bool selected) { Category = category; IsSelected = selected; }

public Category Category { get; set; } public bool IsSelected { get; set; } }}

Ahora vamos a crear otra clase llamada PostViewModel y vamos a colocar el siguiente código

using System;using System.Collections.Generic;using System.Linq;using System.Web;using Core.Domain.Model;

namespace NHibernate101.Models{ public class PostViewModel { public PostViewModel() : this(new Post(), new List<Category>()) { }

public PostViewModel(Post post, IList<Category> allCategories) { Post = post; AllCategories = new List<PostCategory>(); foreach (Category c in allCategories) { AllCategories.Add(new PostCategory(c, OnPost(c.Id))); } }

private bool OnPost(Guid categoryId) { foreach (Category c in Post.Categories) {

Page 10: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

if (c.Id.ToString() == categoryId.ToString()) return true; } return false; }

public PostViewModel(Post post) : this(post, new List<Category>()) { }

public PostViewModel(IList<Category> allCategories) : this(new Post(), allCategories) { }

public Post Post { get; set; } public IList<PostCategory> AllCategories { get; set; } }}

Perfecto entonces ahora vamos crear nuestro primer controlador llamado CategoriesController

Ponemos la siguiente referencia en códigousing Core.Domain.Model;using Core;using Core.Domain.Repositories;

namespace NHibernate101.Controllers{ public class CategoriesController : Controller { // // GET: /Categories/ public ActionResult Index() { IRepository<Category> repo = new CategoryRepository(); return View(repo.GetAll()); }

}}

Compilamos con Build y creamos la vista

Page 11: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

Escogemos Core.Domain.Model.Category y podemos ver todas nuestras categorías ustede pueden compararlo con la siguiente vista ahh no olviden quitar el id

<h2>Categories</h2>

<table> <tr> <th></th> <th> Name </th> <th></th> </tr>

<% foreach (var item in Model) { %> <tr> <td> <%= Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> | <%= Html.ActionLink("Details", "Details", new { id = item.Id })%> </td> <td> <%= Html.Encode(item.Name) %> </td> <td>

Page 12: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

<%= Html.ActionLink("Delete", "Delete", new { id = item.Id })%> </td> </tr> <% } %>

</table>

<p> <%= Html.ActionLink("Create New", "Create") %> </p>

Ahora vamos agregar otro método a nuestro controlador

public ActionResult Details(Guid id) { IRepository<Category> repo = new CategoryRepository(); return View(repo.GetById(id)); }Y creamos la vista igual que la anterior pero solo esta vez para detalle

Y comparamos con el siguiente código

<h2>Post Details</h2>

<fieldset> <legend>Fields</legend> <p> Name: <%= Html.Encode(Model.Name) %> </p> </fieldset>

Page 13: Web viewCrear la base de datos en Sql Server llamado ... Crean un proyecto mvc2 en Visual Studio llamado AplicacionBlog. Agregar nuevo proyecto y escoger dos

<p> <%=Html.ActionLink("Edit", "Edit", new { id=Model.Id }) %> | <%=Html.ActionLink("Back to List", "Index") %> </p>

Bien ahora para que vayan comparando cada una de las vista subiré el ejemplo para que lo bajen