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

Upload: phungdang

Post on 06-Feb-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

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